MySQL GROUP BY忽略ORDER BY子句

时间:2012-01-19 07:55:08

标签: php mysql group-by

我有两个查询,唯一的区别是GROUP BY子句

SELECT * FROM `packages_sorted_YHZ` WHERE `hotel_city` = 'Montego Bay'
ORDER BY  `deal_score` DESC 
LIMIT 0,3;

SELECT * FROM `packages_sorted_YHZ` WHERE `hotel_city` = 'Montego Bay'
GROUP BY `hotel_name`
ORDER BY  `deal_score` DESC
LIMIT 0,3;

第一个查询返回第一个结果,deal_score为75,但第二个查询返回第一个结果,deal_score只有72个。

我原以为无论GROUP BY子句如何,第一个结果都可能获得最高的分数(75)

GROUP BY子句的目的是为每个结果选择一个唯一的hotel_name。 有谁知道我在这里做错了什么。

4 个答案:

答案 0 :(得分:4)

无法查看所有数据,我最好的猜测是Group By正在合并数据并为您提供与Where子句匹配的任意值。如果酒店名称不是唯一的,则会发生这种情况,除非您专门查询,否则您将无法获得最高分。

尝试围绕deal_score放置一个Max()。在MySQL中,Group By可以太容易地使用,我喜欢MSSQL如何强制使用聚合函数并按每个未聚合的字段进行分组。试试这个问题:

SELECT `hotel_name`, MAX( `deal_score` ) AS `max_score` FROM `packages_sorted_YHZ` WHERE `hotel_city` = 'Montego Bay'
GROUP BY `hotel_name`
ORDER BY  `max_score` DESC
LIMIT 0,3;

答案 1 :(得分:4)

看起来您正面临一些非常MySql的特定问题。理论上,您的第二个查询无效,应该返回错误。但MySQL允许选择所谓的hidden columns - group by子句中未提及但未汇总的列。

如手册中所述,隐藏列值是不确定的,但实际上它通常会选择行走所使用索引的第一行,而不管ORDER BY指定的排序,因为排序是在之后执行的 strong>分组。

这是特定于供应商的问题,因此如果用于查询其他RDBMS,则第二个查询应始终失败。正确的实现应该是

SELECT max(`deal_score`) as maxdeal, `hotel_name` FROM `packages_sorted_YHZ` WHERE `hotel_city` = 'Montego Bay'
GROUP BY `hotel_name`
ORDER BY maxdeal
LIMIT 0,3;

答案 2 :(得分:1)

您不应该使用GROUP BY,而应使用DISTINCT,因为您需要唯一 hotel_name

示例:

SELECT DISTINCT hotel_name -- add other fields here
FROM `packages_sorted_YHZ` 
WHERE `hotel_city` = 'Montego Bay'
ORDER BY  `deal_score` DESC
LIMIT 0,3;

答案 3 :(得分:0)

SELECT max(deal_score) as maxdealscore, `hotel_name` * FROM `packages_sorted_YHZ` WHERE `hotel_city` = 'Montego Bay'
GROUP BY `hotel_name`
ORDER BY  `deal_score` DESC
LIMIT 0,3;