MySQL GROUP BY按最低字段值分组

时间:2014-10-08 09:52:28

标签: mysql

我正在尝试获取每家酒店每天的最低价格,我得到了多个结果。 我首先尝试使用MIN()函数获取最低金额,然后使用内连接。 当我稍后尝试在子查询外部进行分组时,它只按最低ID分组。 SQL本身:

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,所以我可以内连接

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分:0)

好吧,我还是要使用子查询,因为我需要从相应的行到内部连接其他一些东西的一些额外的外键字段。它不是一个很好的解决方案,因为它会占用太多东西,其余的会以编程方式过滤掉。

这里最烦人的事情是,当我尝试使用MIN()或MAX()函数并获取该行的相应字段时,它从DB获取第一个结果,这是不正确的,所以我必须使用子查询到内部联接以获取其他字段,我可以使用分组,但我有太多的字段要分组。也许我错过了什么。数据量不会及时增长,所以我想它对我有用。所以这是我提出的最终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