我得到了这张表:
id | score
1 | 1
2 | 4
3 | 4
4 | 3
5 | 2
6 | 2
7 | 1
8 | 4
9 | 2
10 | 3
我需要按分数降序排序:
id | score
2 | 4
3 | 4
8 | 4
4 | 3
10 | 3
5 | 2
6 | 2
9 | 2
1 | 1
7 | 1
并获取以id
6
所以结果应该是:
6 | 2
9 | 2
1 | 1
这可能吗?提前致谢
最佳答案
我会用累积 sum()
来解决这个问题(MySQL 8.0 中可用):
select
id,
score
from mytable
order by
sum(id = 6) over(order by score desc, id) desc,
score desc,
id
limit 3
sum()
按照要求的方向命令记录;一旦满足 id = 6
的记录,总和就值为 1
。它允许将这些记录放在顶部。剩下的只是添加额外的排序标准并限制结果数量。
<强> Demo on DB Fiddle :
| id | score |
| --- | ----- |
| 6 | 2 |
| 9 | 2 |
| 1 | 1 |
在早期版本的 mysql 中,您可以使用用户变量模拟窗口总和,如下所示:
select
id,
score
from
(select @sm := 0) s
cross join (select id, score from mytable order by score desc, id) t
order by
case when id = 6 then @sm := @sm + 1 end desc,
score desc,
id
limit 3
<强> Demo on DB Fiddle :相同的结果
关于MySQL 在排序/排序后获取以特定 id 开头的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58476801/