MySQL联合查询分组排序异常求助:按年份分组指定不同排序规则
解决MySQL联合查询排序不符合预期的问题
你的查询问题出在子查询内部的ORDER BY不会生效——MySQL处理UNION ALL时,会忽略子查询里的排序规则(除非子查询搭配LIMIT使用),所以最终结果的排序逻辑没有按你的要求执行。
以下是两种可行的解决方法:
方法一:给子查询添加LIMIT保留排序
给每个子查询加上一个足够大的LIMIT值(确保能包含所有符合条件的记录),让MySQL保留子查询的排序结果:
SELECT Name, Year_of_Release, Other_Sales, Global_Sales FROM ( SELECT * FROM games WHERE Year_of_Release >= 2000 ORDER BY Global_Sales DESC, Name ASC LIMIT 18446744073709551615 -- MySQL无符号大整数最大值,覆盖所有可能的记录数 ) a UNION ALL SELECT Name, Year_of_Release, Other_Sales, Global_Sales FROM ( SELECT * FROM games WHERE Year_of_Release < 2000 ORDER BY Other_Sales DESC, Name ASC LIMIT 18446744073709551615 ) b;
方法二:用CASE表达式实现整体排序(推荐)
不需要拆分查询,直接在主查询的ORDER BY中通过CASE区分两组的排序规则,逻辑更清晰且性能更优:
SELECT Name, Year_of_Release, Other_Sales, Global_Sales FROM games ORDER BY -- 优先展示2000年及以后的记录 CASE WHEN Year_of_Release >= 2000 THEN 0 ELSE 1 END, -- 第一组按全球销量降序、名称升序 CASE WHEN Year_of_Release >= 2000 THEN Global_Sales ELSE NULL END DESC, CASE WHEN Year_of_Release >= 2000 THEN Name ELSE NULL END ASC, -- 第二组按其他地区销量降序、名称升序 CASE WHEN Year_of_Release < 2000 THEN Other_Sales ELSE NULL END DESC, CASE WHEN Year_of_Release < 2000 THEN Name ELSE NULL END ASC;
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

