MySQL 在排序/排序后获取以特定 id 开头的行

标签 mysql sql database sql-order-by

我得到了这张表:

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

开头的前3行

所以结果应该是:

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/

相关文章:

php - Top 5 排名问题

php - 如何从 php mysqli 的结果集中删除行

sql - 优化平均值 SQL 查询的平均值

php - 如何将数据从主键列插入到外键

mysql - SQL 根据百分比选择随机行

MySQL 触发器 - 修剪并创建 2 条记录

SQL 条件 JOIN 列

database - ORA-01749 - 甲骨文 12c 与 11g

node.js - LevelDB with Node 在创建时抛出错误

ruby-on-rails - 无法使用带 Rails 的 PostgreSql 创建数据库