从自定义排序和筛选的表中获取上一个和下一个 ID


get previous and next id from customly ordered and filtered table

在我的PHP/mysql应用程序中,用户可以过滤和排序数据库中的记录。可以为每列单独设置过滤器,并且可以为每列 DESC/ASC 设置顺序。他得到了一个表格,他可以在其中单击以详细说明一条记录,并且详细是上一个和下一个按钮女巫将他带到下一个/上一个记录,关于他在桌子上设置的过滤器和顺序。

当表按列排序时,有什么方法可以获取下一个和上一条记录的 id,其中可以是重复值?我试过这样的事情:

select * from foo where column = (select min(column) from foo where column > 4)

但这不适用于前一列值与当前列值相同的记录。

因此,一个表可以有几百万条记录,我不能只选择所有记录并遍历整个表。

如果我

正确理解了你的问题,这个肮脏的东西可能会有所帮助:

  1. 首先,您可以像这样编写 SELECT 查询:

    SET @row_num=0;
    SELECT @row_num:=@row_num+1 AS `row_num`, t_table.* FROM t_table WHERE type_id>0 ORDER BY type_id ASC, type_place_id DESC, user_id DESC LIMIT 100;
    

这里的要点是获取每行的订单号(将出现在第 row_num 列中)。

  1. 第二步是保存单击记录 ($current) row_num值。
  2. 因此,要获取有关当前记录的数据,您可以使用下一个查询:

    SET @row_num=0;
    SELECT * FROM 
    (SELECT @row_num:=@row_num+1 AS `row_num`, t_table.* FROM t_table WHERE type_id>0 ORDER BY type_id ASC, type_place_id DESC, user_id DESC LIMIT 100) AS counted_view WHERE counted_view.row_num = {$current};
    

关于上一页:

    SET @row_num=0;
    SELECT * FROM 
    (SELECT @row_num:=@row_num+1 AS `row_num`, t_table.* FROM t_table WHERE type_id>0 ORDER BY type_id ASC, type_place_id DESC, user_id DESC LIMIT 100) AS counted_view WHERE counted_view.row_num = {$current - 1};

下一条记录:

SET @row_num=0;
SELECT * FROM 
(SELECT @row_num:=@row_num+1 AS `row_num`, t_table.* FROM t_table WHERE type_id>0 ORDER BY type_id ASC, type_place_id DESC, user_id DESC LIMIT 100) AS counted_view WHERE counted_view.row_num = {$current + 1};