假设我有ID 3,4,7,9的记录,我希望能够通过下一个/上一个链接导航从一个到另一个 . 问题是,我不知道如何获取最近的更高ID的记录 .
因此,当我有一个ID为4的记录时,我需要能够获取下一个现有记录,这将是7.查询可能看起来像
SELECT * FROM foo WHERE id = 4 OFFSET 1
How can I fetch next/previous record without fetching the whole result set and manually iterating?
我正在使用MySQL 5 .
20 回答
下一个:
以前:
除了cemkalyoncu's解决方案:
下一条记录:
之前的纪录:
edit: 由于这个答案最近得到了一些支持,我真的想强调comment I made早先关于理解主键列不是要排序的列,因为MySQL不保证更高的自动递增值是必须在以后添加 .
如果你不关心这个,只需要更高(或更低)
id
的记录,那么这就足够了 . 只是不要将其用作确定记录是否实际在以后(或更早)添加的方法 . 例如,请考虑使用datetime列进行排序 .以上所有解决方案都需要两次数据库调用下面的sql代码将两个sql语句合并为一个 .
我试图做类似的事情,但我需要按日期排序的结果,因为我不能依赖ID字段作为可排序的列 . 这是我提出的解决方案 .
首先,我们根据需要对表中所需记录的索引进行排序:
然后将结果减2,将其放入限制语句中 . 例如,以上为我返回了21,所以我运行:
根据您所声明的订单,为您提供主要记录以及下一个和之前的记录 .
我尝试将其作为单个数据库调用来执行,但无法获取LIMIT语句将变量作为其中一个参数 .
试试这个例子 .
Note: 如果未找到 value ,则返回 null .
在上面的示例中, Previous 值将为 Raja , Next 值将为 null ,因为没有下一个值 .
下一行
上一行
下一行示例
上一行示例
使用@Dan的方法,您可以创建JOIN . 只需为每个子查询使用不同的@variable .
我和Dan有同样的问题,所以我用他的答案改进了它 .
首先选择行索引,这里没什么不同 .
现在使用两个单独的查询 . 例如,如果行索引是21,则选择下一条记录的查询将是:
要选择以前的记录,请使用以下查询:
请记住,对于第一行(行索引为1),限制将变为-1,您将收到MySQL错误 . 您可以使用if语句来防止这种情况 . 只是不要选择任何东西,因为无论如何都没有以前的记录 . 在最后一条记录的情况下,将有下一行,因此将没有结果 .
另外请记住,如果您使用DESC进行排序,而不是ASC,则查询选择下一行和前一行仍然相同,但是已切换 .
这是具有更多相同结果的条件的通用解决方案 .
如何获得MySQL和PHP的下一个/上一个记录?
我的例子是只获取id
优化@Don方法仅使用一个查询
使用当前文章ID更改CurrentArticleID
在这里,我们有一种方法可以使用单个MySQL查询获取上一个和下一个记录 . 其中5是当前记录的id .
您可以使用类似于@row技巧的变量,使用您想要的任何顺序显示前一行中的列的另一个技巧:
显然,选择列按顺序进行评估,因此首先选择已保存的变量,然后将变量更新为新行(在过程中选择它们) .
注意:我不确定这是定义的行为,但我已经使用它并且它有效 .
如果你想查询 feed more than one id 并获得
next_id
所有这些...在选择字段中分配
cur_id
,然后将其提供给子查询,在选择字段内获取next_id
. 然后选择next_id
.使用longneck回答calc
next_id
:如果你有一个索引列,比如id,你可以在一个sql请求中返回上一个和下一个id . 替换:id与您的值
如果我是最后一个,那么我获得下一个和预览记录的解决方案也会回到第一条记录,反之亦然
我没有使用id我正在使用 Headers 为漂亮的网址
我正在使用Codeigniter HMVC
从foo中选择top 1 *,其中id> 4 order by id asc
我想在SQL表中有真正的下一行或前一行我们需要相等的实数值,(<或>)如果需要在排序表中更改行的位置,则返回多个 .
我们需要值
$position
来搜索neighbours
行在我的表中我创建了一个列'position'和获取所需行的SQL查询是:
下一个:
对于上一个: