我在阅读类似问题时找不到答案,因此我将在此处提出问题,感谢您对此问题的任何帮助。

在MySQL DB中,有一个包含文章的表:

id        date     is_active                title                  text
 3     2017-01-20      1     New payment system goes live       some articl
 5     2017-01-21      1     Library v.2.5 released             some articl
 6     2017-01-22      1     New skins and themes               some articl
 7     2017-01-25      0     Terms and Conditions updated       some articl
 8     2017-01-26      1     Don't forget to subscribe          some articl
10     2017-01-22      0     Support Chat beta release          some articl
11     2017-01-30      1     Maintenance window next Sunday     some articl
12     2017-01-28      1     Refer a friend and get a bonus     some articl
13     2017-01-26      1     Follow us in social networks       some articl
14     2017-01-22      1     Video sharing feature is now live  some articl


我有2个网页:


按日期排序的所有活动文章的列表(重要:几篇文章可能具有相同的日期)。
这工作正常,这里没有问题。
单篇文章阅读页面,此外,该页面上还有“下一页”和“上一页”链接
这是一个问题。


我想将“ next”和“ prev”链接显示为href =“ article.php?id = 8”。所以我想根据这样的查询从数据库中获取下一个记录ID:

SELECT id FROM articles WHERE date > (SELECT date FROM news WHERE id = 6) and isactive = 1 ORDER BY date ASC LIMIT 1;


但是,在定义具有相同日期的下一个商品ID时,我的查询无法正常工作。当用户停留在文章id = 3上并多次单击“下一步”时,我期望加载文章的顺序如下:

id        title      date     is_active
 5     Library v.2 2017-01-21      1
 6     New skins a 2017-01-22      1
14     Video shari 2017-01-22      1
 8     Don't forge 2017-01-26      1
13     Follow us i 2017-01-26      1
12     Refer a fri 2017-01-28      1
11     Maintenance 2017-01-30      1


但是我得到的是:5、6、8、12、11。因此该顺序中缺少2条记录(标识:14和13),因为它们具有相同的日期。
我尝试使用不同的查询,但是所有结果都不是100%正确(在某些情况下,它总是返回相同的数字,例如:5、6、14、6、14 .....等)

是否可以通过MySQL查询基于当前ID和所需顺序获取“下一个” ID?我不反对做几个查询或使用嵌套查询。

作为一种解决方法,我当然可以检索所有id的有序数组,如下所示:

SELECT id FROM articles WHERE isactive=1 ORDER BY date


然后使用此数组定义“下一个”和“上一个”,但是我不喜欢这种解决方案。
如果您可以指出一些类似的主题或其他可能的解决方法,请这样做。
谢谢。

最佳答案

 SELECT id
 FROM   articles
 WHERE  date >= (SELECT date -- changed
           FROM   news
           WHERE  id = 6)
          AND isactive = 1
          AND id NOT IN(6) -- added, maybe id!=6 or id<>6
 ORDER  BY date ASC
 LIMIT  1
-- (all id date >= date) - (id=6)


为什么这样做,为什么不使用
从新闻中选择ID依日期排序ASC LIMIT 6,1-位置,计数
如果使用SQL查询缓存,则速度可能会更快。

关于php - 获取下一个和上一个记录按非唯一字段排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47631805/

10-11 09:06
查看更多