我有一个posts
表,其中id
不一定是顺序的。帖子应按其created
时间戳值排序,但有两个帖子可能具有相同的created
时间戳,在这种情况下,我希望按id
排序。
鉴于此顺序,我试图找到紧接在指定条目之前的条目。
示例:(降序)
id | created
------|------------
4 | 2017-01-05
15 | 2017-01-04
12 | 2017-01-04
2 | 2017-01-04
8 | 2017-01-02
11 | 2017-01-01
(我将时间戳简化为日期,但你明白了。)
在这个例子中,给定id
2,我想返回id
8。经过一些实验,我得出以下结论:
SELECT id
FROM posts
WHERE created < ? OR id < ?
AND created = ?
ORDER BY created DESC, id DESC
LIMIT 1
考虑到查询中正确位置的时间戳和id,这是有效的。但是非常繁琐。
我现在的问题是:
在给定排序的情况下,是否有更简单的方法来查找前一个元素?
澄清:
上面的代码确实返回了正确的结果,但我想知道是否有更通用的方法来实现相同的,如果排序规范发生变化,将更容易适应...
答案 0 :(得分:3)
您可以使用元组:
SELECT id
FROM posts
WHERE (created, id) < (?,?)
ORDER BY created DESC, id DESC
LIMIT 1
答案 1 :(得分:-1)
你所拥有的一切都很好......否则我能想到的唯一方法是使用concat和lpad创建一个订单,但这比你所拥有的更令人困惑。 使用concat和lpad的混淆方法更加令人困惑
SELECT id,created FROM POSTS
WHERE CONCAT(created,LPAD(id, 8, '0')) < CONCAT('2017-01-04',LPAD(2, 8, '0'))
ORDER BY created desc, id desc
LIMIT 1