MySQL在排序

时间:2017-01-19 21:22:39

标签: mysql sorting

我有一个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,这是有效的。但是非常繁琐。

我现在的问题是:

在给定排序的情况下,是否有更简单的方法来查找前一个元素?

澄清:

上面的代码确实返回了正确的结果,但我想知道是否有更通用的方法来实现相同的,如果排序规范发生变化,将更容易适应...

2 个答案:

答案 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