排序规则
源数据:
目前我的 Sql:
SELECT * FROM test ORDER BY IF (age=24,0,1),id DESC;
查询效果:
目前该表数据 117 万条:
1
opengps 2020-05-26 16:08:23 +08:00 via Android
你可以尝试用一个中间列过渡下,(盲猜,性能不确定)
把 24 的填充 1,非 24 的填充 2,然后的排序规则就是~ 第一排序中间列正序,第二排序 id 列倒序 |
2
CRVV 2020-05-26 16:32:07 +08:00 via Android
ORDER BY IF (age=24,-id,1),id DESC
|
3
CRVV 2020-05-26 16:35:30 +08:00 via Android
不过,有 100 多万行的话,这样也许会比较慢。
查一个 WHERE age = 24 再另查一个 age <> 24 可能快一些 |
4
luckyrayyy 2020-05-26 16:37:20 +08:00
union?一个查询 24 一个查询非 24 然后一起展示
|
5
zhongjun96 OP |
6
kalok 2020-05-26 17:43:35 +08:00
(SELECT * from test Where age = 24 Order By id ASC)
Union All (SELECT * from test Where age != 24 Order By id DESC); |
7
zhongjun96 OP @kalok 试过了,不知为何,第二个排序会失效
<a href="https://sm.ms/image/wqi8nhHFOJoIyNR" target="_blank"><img src="https://i.loli.net/2020/05/26/wqi8nhHFOJoIyNR.png" ></a> |
8
kalok 2020-05-26 18:23:32 +08:00
我懂了,Union 之后会打乱次序,那只有像做数学题那样,位移了。
SELECT * from test Order By (Case When age = 24 Then -100 + id ELSE 1000 - id END ) ASC; |
9
fy1993 2020-05-26 18:41:15 +08:00
必须要用 sql 实现吗, 可不可以先取出全量 24 的数据到内存中通过程序排序, 然后同样方式取出其他数据也在内存中排序
|
10
daozhihun 2020-05-26 18:42:53 +08:00
做个临时表拼在一起就可以了
|
11
CRVV 2020-05-26 21:00:04 +08:00 via Android
@zhongjun96
ORDER BY IF (age=24, id, 2147483647) ASC, id DESC 如果是别的数据库可以用 null 然后 asc nulls last,MySQL 不支持这么写,只能放一个大数字了 |
12
akira 2020-05-26 21:12:28 +08:00 1
新加一列,sid , 如果 age=24 则 sid = 99999999 - id,否则 sid = id 。
然后按 sid 逆序排 |