【问题标题】:MYSQL GROUP BY and ORDER BY not working together as expectedMYSQL GROUP BY 和 ORDER BY 没有按预期一起工作
【发布时间】:2015-09-18 08:34:41
【问题描述】:

我将尝试用两种情况来解释我的问题:

  1. 当我在查询中仅使用 ORDER BY 子句时:请参见第一张图片。

  2. 当我同时使用 GROUP BY 和 ORDER BY 子句时:见第二张图片

我的要求是每家酒店只获取一条记录,没有重复,第二次排序应该是最低的酒店价格应该在TOP上;

我的意思是记录我需要将third_party_rate 拉为1041 的记录。

您可以查看下面的文本格式的MySQL代码:

SELECT h.hotel_id AS id,h.hotel_city AS city,h.hotel_name AS hotelname,h.hotel_star AS hotelcat,hwd.double_spl_rate, hwd.extra_bed_spl_rate,hwd.meal_plan_spl,hwd.third_party_rate,hwd.third_party_extra_bed, hwd.third_party_meal_plan,hwd.room_category,hrd.hotel_rate_from,hrd.hotel_rate_to FROM hotels_list AS h 
INNER JOIN hotel_rate_detail AS hrd ON h.hotel_id = hrd.hotels_id 
INNER JOIN hotel_week_days AS hwd ON hrd.hotel_id = hwd.h_id 
WHERE ( ('2015-07-02' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) OR ('2015-07-03' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) ) AND (h.hotel_city = '1')
AND (hwd.double_spl_rate != 0 OR hwd.third_party_rate != 0) AND (h.hotel_star <= '2') 
AND h.hotel_id = 364
GROUP BY h.hotel_id ORDER BY hwd.double_spl_rate,hwd.third_party_rate ASC;

请注意,我在上述上下文中仅使用了 id = 364 来显示结果,但是在这种情况下还有许多其他重复的酒店 ID,所以我需要一个通用查询,它不仅适用于 id = 364,而且适用于其他ids,这样我就可以通过一个查询获得完整的结果。

【问题讨论】:

  • 我不知道 NOT WORKING TOGETHER 是 MySQL 语言中的一个特性。你用的是什么版本?
  • 请不要将查询和结果发布为屏幕截图,将它们粘贴为文本。不要在标题中大喊大叫。

标签: mysql


【解决方案1】:

MySQL 将允许这些愚蠢的查询,其中假设GROUP BY 包含所有列,即使您没有指定它们。首先进行分组,因此如果只有一个结果,则排序不起作用。

您需要使用MIN(third_party_rate) 来获取该列的最小值。

【讨论】:

  • 我会更进一步——对我来说,MySQL 的这个特性不仅愚蠢,而且完全错误和危险,因为它会导致意想不到的结果。
  • @FrankSchmitt 我完全同意。选择随机行而不给出错误消息是非常糟糕的。但这就是 MySQL 发生的事情,用户应该期待这一点。不幸的是,没有人警告他们这一点。
【解决方案2】:

在 SQL 中,在您的排序完成后首先进行分组。

所以在这种情况下,您可以先order 您的记录。将结果与您的特定列分组,它将为您返回任何您想要的给定记录。你可以用你的查询喜欢。如下所示替换您的查询:

例如

select * from 
  (select * from table_name order by column_name Asc) 
  as t group by t.column_name_for_group

我认为您的查询可以帮助您达到记录:

Select * from (SELECT h.hotel_id AS id,h.hotel_city AS city,h.hotel_name AS hotelname,h.hotel_star AS hotelcat,hwd.double_spl_rate, hwd.extra_bed_spl_rate,hwd.meal_plan_spl,hwd.third_party_rate,hwd.third_party_extra_bed, hwd.third_party_meal_plan,hwd.room_category,hrd.hotel_rate_from,hrd.hotel_rate_to FROM hotels_list AS h 
INNER JOIN hotel_rate_detail AS hrd ON h.hotel_id = hrd.hotels_id 
INNER JOIN hotel_week_days AS hwd ON hrd.hotel_id = hwd.h_id 
WHERE ( ('2015-07-02' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) OR ('2015-07-03' BETWEEN hrd.hotel_rate_from AND hrd.hotel_rate_to) ) AND (h.hotel_city = '1')
AND (hwd.double_spl_rate != 0 OR hwd.third_party_rate != 0) AND (h.hotel_star <= '2') 
AND h.hotel_id = 364
ORDER BY hwd.double_spl_rate,hwd.third_party_rate ASC) as result_table GROUP BY result_table.id;

【讨论】:

  • “在 MySQL 中首先完成分组...” - 这不仅适用于 MySQL,而且适用于所有其他 RDBMS
  • @Vishal 你的代码给了我错误代码:1054 Unknown column 'result_table.hotel_id' in 'group statement'
  • 嘿,对不起,我认为您将 hotel_id 别名为 id,您只需要 GROUP BY result_table.id;在上面的查询中替换
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2017-05-30
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多