【问题标题】:MySQL GROUP BY grouping by lowest field valueMySQL GROUP BY 按最低字段值分组
【发布时间】:2014-10-08 09:52:28
【问题描述】:

我正在尝试获取每家酒店每天的最低价格,但我得到了多个结果。 我首先尝试使用 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,所以我可以内部加入

【问题讨论】:

  • 如果您遇到 SQL 问题,那么 SQLFIDDLE 可能比 JSFIDDLE 更有用

标签: mysql


【解决方案1】:

试试这个:

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;

【讨论】:

  • 这非常接近,但问题在于获取可能对该行也有用的相应字段。因此,假设有一个 fk_roomtype 字段,如果我将其添加到选择字段中,它将获取 DB 中的第一个结果值,而不是该特定数量的对应值。我想让 fk_roomtype 在另一个表上进行内部连接。我想这需要一个子查询?如何增强此查询?
【解决方案2】:

首先使用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

【讨论】:

  • @test:如果有帮助请告诉我?
  • 没用。我得到了 fk_hotel = 1 和 start_date = 2014-10-08 的 4 个结果。并且 id 和金额没有反映 DB 中的正确行(例如 id 223 金额应该是 195,但我得到了 175)。
  • 请添加一个 sqlfiddle 而不是 jsfiddle,请提供您的数据库的架构。我肯定能帮助你:)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多