从自定义排序和过滤中获取上一个和下一个 ID table

get previous and next id from customly ordered and filtered table

在我的 PHP/mysql 应用程序中,用户可以从数据库中筛选和排序记录。可以为每一列单独设置过滤器,并且可以为每一列设置顺序DESC/ASC。他得到一个 table ,他可以在其中单击以详细说明一条记录,详细信息是上一个和下一个按钮 将他带到 next/previous 关于他在 [= 设置的过滤器和顺序的记录24=]。

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

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

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

因为 table 可以有数百万条记录,我不能只 select 全部并遍历整个 table。

如果我正确理解了你的问题,这个东西可能会有帮助:

  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. 第二步保存点击记录的row_num值($current)。
  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};