我有一个内容Feed,按date DESC, id DESC
排序
date
只是日期,而不是日期时间
id
是典型的INT auto_increment
。
我需要查询“在特定行之后”的n
行。 (想象一下无限滚动,需要“获取比当前最后一个项目更旧的项目”)
我会查询where id < :last_id
,但问题是date
的顺序与_id
的顺序不一致。
我会查询where date < :last_date
,但问题是“每天”有超过1项。我会丢失使用相同日期的所有项目。
我会查询ORDER BY date DESC, id DESC LIMIT x, n
,但Feed可能会在2个查询之间发生变化,将新项目添加到顶部,从而转移整个偏移量。
我目前的hacky解决方案是查询where date <= :last_date ORDER BY LIMIT date DESC, id DESC LIMIT n+20
,然后“手动”丢弃当前最新项目之前的结果。 (希望不超过20个)。
我确信我不是第一个遇到类似问题的人......有什么想法吗?
答案 0 :(得分:1)
如果您每天有多个商品,那么您应该已经有了二级排序。如果它是id,那么写下你的where子句:
WHERE date < :last_date OR (date = :last_date AND id < :last_id)
答案 1 :(得分:1)
您可以创建一个存储时间戳的字段(+更新current_timestamp?)。我假设你不会在一秒钟内获得多次托管。获得结果后,保存最新的时间戳,并在下一个查询中将其传递给脚本。您的查询可能会更改为:
SELECT * FROM [table] WHERE timestamp_field > [last timestamp] ORDER BY timestamp_field DESC