部分数据如图所示:
由于一些历史原因,主键 id 非自增,唯一但不连续
现在要做的是文章内容页的 下一篇、上一篇 按钮
以上图数据为例,想要达到的效果就是:
例如当前文章 ID 为137
,那么上一篇则为136
、下一篇则为70
。也就是按照表内现有的记录顺序来排
在不考虑性能开销(访问量很低,且可以做缓存)以及尽可能不修改数据表的前提下,如何取出这上 /下一篇的 ID ?
谢谢各位
1
psychesworld 2017-02-21 20:07:00 +08:00
似乎是按时间排序的,你 order by date 就可以了
|
2
mokeyjay OP @psychesworld #1 唔……貌似不一定是按照时间来的
|
3
hd7771 2017-02-21 20:15:53 +08:00
你对这个表扫一遍是不是正常顺序?
|
4
batnss 2017-02-21 20:16:46 +08:00 via Android
id>xxx order by id asc limit 1
|
7
mokeyjay OP @batnss #4 不好意思忘记说了, ID 并不连续,**且并不按照顺序**,目前如图所示的顺序才是正确的。希望能够按照如图顺序取出上 /下一篇的 id
|
9
hd7771 2017-02-21 20:23:43 +08:00
|
10
shiny 2017-02-21 20:25:14 +08:00
应该贴 SQL 。看上去像是先按 date 排序,如果 date 相同则按 id ASC
ORDER BY date DESC, id ASC LIMIT 1 |
12
mokeyjay OP |
13
flniu 2017-02-21 21:11:40 +08:00
楼主已经有方案了。
额外补充一句:表不是数组,如果不指定 ORDER BY ,查询结果的顺序是不确定的。所以要么按时间排序,要么增加序号。 另外自增 ID 可能不连续,所以只能作为序号,但直接用 CurrentID + 1 取下一条可能有问题。 |
14
danielmiao 2017-02-21 22:11:33 +08:00
方案是有的,就是极其损耗性能:
使用存储过程游标查询,从头遍历表,直到查到纪录为止。 最好是只遍历一次,依据数据,建立索引表,链式纪录,指向前一条纪录和后一条纪录 id ,索引表如果数据量不大可以完全缓存在内存里,这样直接命中主键,效率会很高 |
15
akira 2017-02-21 22:26:08 +08:00
@danielmiao 再加个定时刷新一次记录就好。这种数据量在千万级别以内,都是可以随便开内存处理的
|
16
ETiV 2017-02-21 23:04:36 +08:00 via iPhone
如果 poster 自古以来就是这种命名规范,按它来排序就行了……
另外根据常理, weight 、权重,也可以是排序依据 |
17
ryd994 2017-02-22 02:20:46 +08:00 via Android
看这个 ID 也不是太稀疏的样子,直接加一看看没有再加一可能反而更快
测试一下看看 |
18
msg7086 2017-02-22 05:24:54 +08:00
不指定排序条件的,数据库可以自行选择返回数据的顺序。
MySQL 应该是按照记录的物理存储地址来返回的。 这就意味着这张数据表如果被导出再导入,可能就不是原来的顺序了。 |
19
will0404 2017-02-22 07:49:05 +08:00 via iPhone
不是应该先整理下数据再考虑排序的事吗
|
20
paranoiagu 2017-02-22 07:54:16 +08:00 via Android
没有排序字段(规则),怎么确保排序呢?
|