我有两个查询,唯一的区别是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
。
有谁知道我在这里做错了什么。
答案 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;