您使用的是早于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;
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所以需要二次排序。
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;
3条答案
按热度按时间pvcm50d11#
您使用的是早于8+的mysql版本,这意味着您不能在这里使用分析函数。下面是一种方法,使用具有
CASE
表达式:演示
我之所以用一个相关的子查询来计算上面的行号,而不仅仅是使用
id
,那也许是你的id
值可能并不总是从1
,甚至是相邻的。按照id
,而id
价值本身并不总是足够的。注意,这里的分析函数使代码更易于阅读。以下是mysql 8+的功能:
y1aodyip2#
您可以使用相关子查询来计算行的“排名”。排序很简单:
bd1hkmkf3#
根据您的样本数据,最简单的方法是:
如果您不知道第四个id在哪里,那么: