我有一个恒定的时间戳记18040986(在我的查询中为$ readtime)。
现在我的表有很多条目,每个条目都有自己的时间戳。
我想有效地搜索找到比固定时间戳大但也最接近的时间戳。(实质上,我正在尝试查找用户的第一个未读条目)
现在的诀窍是,说没有输入任何条目,那么我希望获得比当前时间戳小的最近时间戳(即,已经读取的最近的旧条目)
我希望通过查询获得帮助以实现这一目标。到目前为止,我进行的基本查询要么效率很低,要么使服务器的爬网速度变慢,要么不准确。我现在使用的查询是
SELECT postid
FROM theposts
WHERE category = '$tid' AND visible='1' AND dateline > '$readtime'
LIMIT 1
但是我担心上面的查询实际上不会返回比我的读取时间更长的下一个最近的postid,如果由于某种原因我的表有一天的输入顺序不正确
我倾向于这样做:
(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] 删除。
我来说两句