MYSQL:可以选择相对于X的最接近的时间戳,该时间戳>>大于X。如果没有,则结果应为最接近的<X?

标记

我有一个恒定的时间戳记18040986(在我的查询中为$ readtime)。

现在我的表有很多条目,每个条目都有自己的时间戳。

我想有效地搜索找到比固定时间戳大但也最接近的时间戳。(实质上,我正在尝试查找用户的第一个未读条目)

现在的诀窍是,说没有输入任何条目,那么我希望获得比当前时间戳小的最近时间戳(即,已经读取的最近的旧条目)

我希望通过查询获得帮助以实现这一目标。到目前为止,我进行的基本查询要么效率很低,要么使服务器的爬网速度变慢,要么不准确。我现在使用的查询是

                    SELECT postid 
                    FROM theposts
                    WHERE category = '$tid' AND visible='1' AND dateline > '$readtime' 
                    LIMIT 1

但是我担心上面的查询实际上不会返回比我的读取时间更长的下一个最近的postid,如果由于某种原因我的表有一天的输入顺序不正确

戈登·利诺夫(Gordon Linoff)

我倾向于这样做:

(SELECT p.postid 
 FROM theposts p
 WHERE p.category = '$tid' AND p.visible='1' AND p.dateline > '$readtime' 
 ORDER BY p.dateline
 LIMIT 1
) UNION ALL
(SELECT p.postid 
 FROM theposts p
 WHERE p.category = '$tid' AND p.visible='1' AND p.dateline < '$readtime' AND
       NOT EXISTS (SELECT 1
                   FROM theposts p
                   WHERE p.category = '$tid' AND p.visible='1' AND
                         p.dateline > '$readtime'
                  )
 ORDER BY p.dateline DESC
 LIMIT 1
)

为了提高性能,您需要在上建立索引theposts(category, visible, dateline)

如果性能不是问题,那么以下是编写查询的更简单方法:

 SELECT p.postid 
 FROM theposts p
 WHERE p.category = '$tid' AND p.visible='1' AND 
 ORDER BY (p.dateline > '$readtime') DESC,
          (case when p.dateline > '$readtime' then p.dateline end) ASC,
          p.dateline DESC
 LIMIT 1

但是,使用此版本,我看不到如何order by使用索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档