2014-10-08 27 views
0

我试图以每个酒店的每日最低价格获取多个结果。 我首先尝试使用MIN()函数获取最低数量,然后使用内部连接。 当我以后尝试通过外部子查询进行分组时,它仅由最低的ID进行分组。 的SQL本身:MySQL GROUP BY按最低字段值分组

SELECT mt.id, mt.amount, mt.fk_hotel, mt.start_date 
FROM price mt 
INNER JOIN 
(
    SELECT price.id, MIN(price.amount) minAmount 
    FROM price 
    WHERE 1=1 AND price.start_date >= '2014-10-08' AND price.start_date <= '2014-10-10' AND price.active = 1 AND price.max_people = 2 
    GROUP BY id 
) t 
ON mt.id = t.id AND mt.amount = t.minAmount 
ORDER BY mt.fk_hotel, mt.amount; 

而结果是这样的: http://jsfiddle.net/63mg3b2j/

我想组由开始日期和fk_hotel使其群体由最低量的值,任何人可以帮助我吗?我清楚了吗?

编辑:我还需要从相应的行场fk_room,这样我就可以内部连接

+0

如果你有一个SQL的一个问题,那么SQLFIDDLE很可能会超过的jsfiddle – Strawberry 2014-10-08 11:14:14

回答

0

那么首先得到使用ORDER BY然后GROUP BY与顶行中最低值的表为您想要的结果

SELECT mt.id, mt.amount, mt.fk_hotel, mt.start_date 
FROM 
    (SELECT id, amount, fk_hotel, start_date 
    FROM price 
    WHERE start_date >= '2014-10-08' AND start_date <= '2014-10-10' 
    AND active = 1 AND max_people = 2 
    ORDER BY amount DESC) AS mt 
GROUP BY mt.id 
+0

更加有用@test:请让我知道如果这有帮助吗? – 2014-10-08 10:17:21

+0

没有工作。我得到4个结果fk_hotel = 1和start_date = 2014-10-08。而身份证和金额没有反映在DB中的正确的行(例如ID 223的数量应该是195,但我得到了175)。 – test 2014-10-08 10:21:55

+0

请添加sqlfiddle而不是jsfiddle,moroever请提供您的db的架构。我将能够帮助你确定:) – 2014-10-08 10:24:52

0

试试这个:

SELECT MIN(mt.amount) AS min_amount, mt.fk_hotel, mt.start_date 
FROM price mt 
WHERE 
    mt.active = 1 AND 
    mt.max_people = 2 AND 
    mt.start_date >= '2014-10-08' AND mt.start_date <= '2014-10-10' 
GROUP BY mt.fk_hotel, mt.start_date 
ORDER BY mt.fk_hotel, min_amount; 
+0

这是非常接近,但问题是获得相应的字段,可能也是有用的那一行。所以我们假设有一个fk_roomtype字段,如果我将它添加到选择字段,它将获取数据库中的第一个结果值,而不是相应的那个特定数量的值。我想让fk_roomtype在另一个表上进行内部连接。我想这需要一个子查询?如何增强此查询? – test 2014-10-08 11:09:17

0

好吧,我只好仍与子查询去,因为我需要一些额外的外键的字段来回回在相应的行内部加入其他一些东西。这不是一个好的解决方案,因为它提取的东西太多了,剩下的部分被编程过滤掉了。当我尝试使用MIN()或MAX()函数并获取适当的字段到该行时,它从数据库中获取第一个结果,这是不正确的,所以我不得不使用一个子查询到内部连接以获得其他字段,我可以使用分组,但是我有太多的字段要分组。也许我错过了一些东西。数据量没有及时增长,所以我猜这对我很有用。因此,这是最后的SQL我想出了,以备将来参考..

SELECT mt.*, roomtype.name roomname, hotel.name hotelname 
FROM booking.price mt 
INNER JOIN roomtype ON roomtype.id = mt.fk_roomtype 
INNER JOIN hotel ON hotel.id = mt.fk_hotel 
INNER JOIN(    
    SELECT price.id, MIN(price.amount) minAmount 
    FROM booking.price WHERE 1=1 AND price.start_date >= '2014-10-22' AND price.start_date <= '2014-10-31' AND price.max_people = 2 AND price.active = 1 
    GROUP BY id 
) t 
ON mt.id = t.id AND mt.amount = t.minAmount 
ORDER BY mt.start_date, mt.amount