大量数据, Mysql 多规则,优先排序的问题

2020-05-26 15:17:21 +08:00
 zhongjun96

排序规则

  1. age=24 的数据优先展示
  2. age=24 的数据 Id 正序显示
  3. 其它数据 Id 倒序显示

源数据:

目前我的 Sql:

SELECT * FROM test ORDER BY IF (age=24,0,1),id DESC;

查询效果:


目前只能实现规则 1,3 。 请问如何实现全部规则。

目前该表数据 117 万条:

1986 次点击
所在节点    程序员
12 条回复
opengps
2020-05-26 16:08:23 +08:00
你可以尝试用一个中间列过渡下,(盲猜,性能不确定)
把 24 的填充 1,非 24 的填充 2,然后的排序规则就是~
第一排序中间列正序,第二排序 id 列倒序
CRVV
2020-05-26 16:32:07 +08:00
ORDER BY IF (age=24,-id,1),id DESC
CRVV
2020-05-26 16:35:30 +08:00
不过,有 100 多万行的话,这样也许会比较慢。
查一个 WHERE age = 24 再另查一个 age <> 24 可能快一些
luckyrayyy
2020-05-26 16:37:20 +08:00
union?一个查询 24 一个查询非 24 然后一起展示
zhongjun96
2020-05-26 17:02:24 +08:00
@CRVV 试了一下,没效果,24 的 id 还是倒序了。
![]( https://i.bmp.ovh/imgs/2020/05/84e0aeb2d049e320.png)
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);
zhongjun96
2020-05-26 17:48:02 +08:00
@kalok 试过了,不知为何,第二个排序会失效
<a href="https://sm.ms/image/wqi8nhHFOJoIyNR" target="_blank"><img src="https://i.loli.net/2020/05/26/wqi8nhHFOJoIyNR.png" ></a>
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;
fy1993
2020-05-26 18:41:15 +08:00
必须要用 sql 实现吗, 可不可以先取出全量 24 的数据到内存中通过程序排序, 然后同样方式取出其他数据也在内存中排序
daozhihun
2020-05-26 18:42:53 +08:00
做个临时表拼在一起就可以了
CRVV
2020-05-26 21:00:04 +08:00
@zhongjun96
ORDER BY IF (age=24, id, 2147483647) ASC, id DESC

如果是别的数据库可以用 null 然后 asc nulls last,MySQL 不支持这么写,只能放一个大数字了
akira
2020-05-26 21:12:28 +08:00
新加一列,sid , 如果 age=24 则 sid = 99999999 - id,否则 sid = id 。
然后按 sid 逆序排

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX