MySQL按最低字段值分组

MySQL按最低字段值分组,mysql,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=

我试图以最低的价格每天每家酒店,我得到了多个结果。 我首先尝试使用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;
结果如下所示:

我想按开始日期和fk_酒店进行分组,以便按最低金额值进行分组,有人能帮我吗?我说清楚了吗


编辑:我还需要对应行中的字段fk_room,这样我就可以进行内部联接了。首先,使用ORDER 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
试试这个:

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;

我仍然需要使用子查询,因为我需要相应行中的一些额外外键字段来内部连接其他内容。这不是一个很好的解决方案,因为它获取了太多的东西,其余的都是通过编程过滤掉的

这里最烦人的事情是,当我尝试使用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

@测试:请让我知道它是否有用?不起作用。我得到了fk_hotel=1和start_date=2014-10-08的4个结果。id和amount没有反映数据库中的正确行,例如id 223 amount应该是195,但我得到了175。请添加一个sqlfiddle而不是jsfiddle,请提供数据库的模式。我可以肯定地帮助您:这非常接近,但问题在于获取相应的字段,这些字段在该行上可能也很有用。假设有一个fk_roomtype字段,如果我把它添加到select字段中,它将获取第一个结果值,单位为DB,而不是对应于特定数量的值。我想让fk_roomtype在另一个表上进行内部联接。我想这需要一个子查询?如何增强此查询?如果您对SQL有问题,那么SQLFIDLE可能比JSFIDLE更有用