【问题标题】:Get next and previous records sorting by non-unique field获取按非唯一字段排序的下一条和上一条记录
【发布时间】:2018-05-17 19:50:13
【问题描述】:

我在阅读类似问题时无法找到答案,所以我会在这里提出我的问题,感谢您对此问题的任何帮助。

在 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 个网页:

  1. 按日期排序的所有活动文章的列表(重要:多篇文章可能具有相同的日期)。 这工作正常,这里没有问题。

  2. 单篇文章阅读页面,另外我在该页面上有“下一篇”和“上一篇”链接 这是个问题。

我想将“下一个”和“上一个”链接显示为 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 条记录(ID:14 和 13),因为它们具有相同的日期。 我尝试使用不同的查询,但所有结果都不是 100% 正确(在某些情况下,它会不断返回相同的数字,例如:5、6、14、6、14 ......等)

是否可以通过 MySQL 查询根据当前 ID 和所需顺序获取“下一个”ID?我不反对执行多个查询或使用嵌套查询。

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

SELECT id FROM articles WHERE isactive=1 ORDER BY date

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

【问题讨论】:

  • 有多种方法可以达到预期的效果。您可以引入分页,然后在从1 to 20 获取结果集后,您只需移动到下一个数组索引,而不是每次单击都查询它。当你快走到尽头时,查询 next 20
  • WHERE date >= 大于或等于
  • Chay22, >= 将返回与我用于搜索的 ID 相同的 ID。例如,当我阅读文章 id=6 时,查询返回的下一个 id 将是 6(而不是 14)。

标签: php mysql


【解决方案1】:
 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)

为什么要这样做,为什么不使用
SELECT id FROM news ORDER BY date ASC LIMIT 6,1 -- 位置,计数
如果使用 SQL 查询缓存,这可能会更快。

【讨论】:

  • >> AND id NOT IN(6)
  • >> AND id NOT IN(6) // 在这种情况下,我必须将所有已经显示的 ID 都放在同一日期。示例:如果这些记录具有相同的日期并且已被读取,则 AND id NOT IN (6, 14, 15, 20)。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多