在MySQL中查找“下一个”最高的id

5
我正在开发一个网络应用程序,其中有许多非常相似的页面,我希望用户可以浏览。这些“页面”的数据存储在数据库中,主键是唯一的ID。
我想在每个页面上放置一个“下一页”按钮,该按钮查询数据库并找出下一个最高的ID,并显示该ID的数据。我的问题是有几个条件:
- 有时可能会删除或移除页面,这意味着ID中存在间隙,因此我不能只做 -1。 - 我需要仅返回列“active”== 1的页面。
有人有什么提示或建议吗?谢谢!
6个回答

10

像这样的东西?

SELECT id FROM table WHERE id > '$id' AND active = '1' ORDER BY id ASC LIMIT 1

那么一个“上一页”按钮需要像这样:

SELECT id FROM table WHERE id < '$id' AND active = '1' ORDER BY id DESC LIMIT 1

非常感谢,看起来很简单,我甚至不敢相信我没有想到只需将LIMIT设置为1!我也很感激添加了上一页按钮! - Walker
1
不用谢 :) 几天前我也遇到了类似的问题。 - Andreas Grapentin

3
  select t.* 
    from table t
   where t.id = 
         (select min(s.id)
            from table s
           where s.active = 1
             and s.id > target);

嗯,MySQL 查询优化器会在子查询上有点卡顿,但我想在这个问题的范围内它并不是很重要。 - Andreas Grapentin
@Andreas 这将仅从子查询返回一个id,消除了需要对具有大于目标的id的所有行进行排序的需要。我真的认为这应该更快。 - NullUserException
由于子查询独立于外部查询,如果执行计划使其运行超过一次,我会感到惊讶;如果MySQL今天是这样工作的话,我会为一个缺乏想象力的博士生写45分钟的论文。无论如何,对于巨大的N,只需执行两个不同的查询即可实现O(N)的总执行。 - Patrick87
再次强调,这取决于mysql优化器如何处理这两个查询 :) 这将是一个很好的基准测试场景! - Andreas Grapentin
谢谢Patrick,这是一个有趣的解决方案——是我自己想不出来的。我真的很好奇哪个更快。 - Walker
@Walker:你可以通过执行“SET profiling = 1”,发出两个SELECT语句,然后查看“SHOW PROFILES”来找出哪个更快。 - unutbu

2

我不太理解你的情况,但无论如何:

SELECT id
FROM table
WHERE id > $lastid AND active = 1
ORDER BY id ASC
LIMIT 1

?


2
   SELECT id 
    FROM pages
   WHERE id > $current_id AND active = 1
ORDER BY id ASC
   LIMIT 1

1
SELECT id
FROM table
WHERE id < $lastid AND active = 1
ORDER BY id DESC
LIMIT 1

这应该会给你正好你所寻找的,即当前页面下最高ID的活动页面。


0

使用 Codeigniter 的活动记录类 CIAR

然后在您的应用程序中放置 $this->db->select_max(); 以获取行的最大可能 id。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接