2

我遇到了同样的问题Find the highest n values of each group in MySQL

我有一些这样的数据:

+ --------- + ------------ +
| 车道 | 系列 |
+ --------- + ------------ +
| 1 | 680 |
| 1 | 685 |
| 1 | 688 |
| 2 | 第666章
| 2 | 425 |
| 2 | 775 |
+ --------- + ------------ +

而且我想抓住每条车道最高的 n 系列(为了这个例子,我们说 2,但它可能不止于此)所以输出应该是:

+ --------- + ------------ +
| 车道 | 系列 |
+ --------- + ------------ +
| 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 上的结果是这样的:

+ --------- + ------------ +
| 车道 | 系列 |
+ --------- + ------------ +
| 1 | 688 |
| 1 | 685 |
+ --------- + ------------ +

请帮助我使其在 MySQL 5.5 上运行或告诉我为什么结果不同,非常感谢!

更新:因为我的生产数据库中有大约 300 万条记录,我想知道如何以最快的方式获得结果,尽可能快。

4

1 回答 1

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

SQLFiddle 演示

于 2012-09-12T06:05:07.237 回答