mysql中是否有按特定行排序的功能?

vlju58qv  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(311)

我有一张table,例如学生:

id | name
 -- |-----
 1  | A
 2  | B
 3  | C
 4  | D
 5  | E
 6  | F
 7  | G
 8  | H`

如何在mysql中使用sql,以便前4个学生按id升序,其余学生按id降序输出应该是这样的

id |  name
---|------
1  | A
2  | B
3  | C
4  | D
8  | H
7  | G
6  | F
5  | E
pvcm50d1

pvcm50d11#

您使用的是早于8+的mysql版本,这意味着您不能在这里使用分析函数。下面是一种方法,使用具有 CASE 表达式:

SELECT t1.id, t1.name
FROM yourTable t1
ORDER BY
    CASE WHEN (SELECT COUNT(*) FROM yourTable t2 WHERE t2.id <= t1.id) <= 4
         THEN 0
         ELSE 1 END,
    CASE WHEN (SELECT COUNT(*) FROM yourTable t2 WHERE t2.id <= t1.id) <= 4
         THEN id
         ELSE -id END;

演示

我之所以用一个相关的子查询来计算上面的行号,而不仅仅是使用 id ,那也许是你的 id 值可能并不总是从 1 ,甚至是相邻的。按照 id ,而 id 价值本身并不总是足够的。
注意,这里的分析函数使代码更易于阅读。以下是mysql 8+的功能:

SELECT t1.id, t1.name
FROM yourTable t1
ORDER BY
    CASE WHEN ROW_NUMBER() OVER (ORDER BY id) <= 4 THEN 0 ELSE 1 END,
    CASE WHEN ROW_NUMBER() OVER (ORDER BY id) <= 4 THEN id ELSE -id END;
y1aodyip

y1aodyip2#

您可以使用相关子查询来计算行的“排名”。排序很简单:

SELECT *, (SELECT COUNT(*) FROM t AS x WHERE id < t.id) AS rn
FROM t
ORDER BY CASE WHEN rn >= 4 THEN -rn END, rn
``` `SELECT COUNT(*) FROM t AS x WHERE id < t.id` 从0开始为每行指定连续的数字 `CASE WHEN rn >= 4 THEN -rn END` 将空值赋给秩0。。。3所以需要二次排序。
bd1hkmkf

bd1hkmkf3#

根据您的样本数据,最简单的方法是:

order by (case when id <= 4 then 1 else 2 end),
         (case when id <= 4 then id end),
         name desc;

如果您不知道第四个id在哪里,那么:

select s.*
from students s cross join
     (select s2.id
      from students s2
      order by s2.id
      limit 3, 1
     ) as s4
order by (case when s.id <= s4.id then 1 else 2 end),
         (case when s.id <= s4.id then s.id end),
         s.name desc;

相关问题