我遇到了与此Finding the highest n values of each group in MySQL
相同的问题我有一些这样的数据:
+ --------- + ----------- + | lane | series | + --------- + ----------- + | 1 | 680 | | 1 | 685 | | 1 | 688 | | 2 | 666 | | 2 | 425 | | 2 | 775 | + --------- + ----------- +
而且我想获得每个泳道最高的n系列(为了这个例子,我们说2个,但它可能比这更多) 所以输出应该是:
+ --------- + ----------- + | lane | series | + --------- + ----------- + | 1 | 688 | | 1 | 685 | | 2 | 775 | | 2 | 666 | + --------- + ----------- +
我认为带有“时髦”MySQL功能的SQL非常好用。
set @count:=-1, @lane:=0;
select lane, series
from (select lane, series from lane_series order by lane, series desc) x
where if(lane != @lane, @count:=-1, 0) is not null
and if(lane != @lane, @lane:=lane, lane) is not null
and (@count:=@count+1) < 2; -- Specify the number of row at top of each group here
令我惊讶的是,它在MySQL 5.0和MySQL 5.1上运行良好,但它不适用于我的生产MySQL版本的MySQL 5.5。
MySQL 5.5的结果是这样的:
+ --------- + ----------- + | lane | series | + --------- + ----------- + | 1 | 688 | | 1 | 685 | + --------- + ----------- +
请帮助我让它在MySQL 5.5上运行或告诉我为什么结果不同,非常感谢!
更新: 因为我的生产数据库中有大约300万条记录,所以我想知道如何以尽可能快的速度快速获得结果。
答案 0 :(得分:5)
尝试这个,也许它适合你。
SELECT lane, series
FROM tableA
WHERE (
SELECT count(*)
FROM tableA AS f
WHERE f.lane = tableA.lane AND
f.series >= tableA.series
) <= 2
ORDER BY lane, series DESC