【问题标题】:PHP SQL Get Next Row in Query (with user ordered results)PHP SQL Get Next Row in Query (with user ordered results)
【发布时间】:2011-02-09 01:52:52
【问题描述】:

我带来了这个question up previously,但我收到的答案仅在某些情况下有效,但对大多数情况无效。

我有一个显示产品列表的页面。我有 5000 多个产品,它们显示的页面具有排序和搜索能力。用户可以按升序或降序按 5-6 列中的任何一列进行排序。他们可以按具有许多重复值的“强度”列进行排序。甚至“名称”列也有重复值。

由于这些排序控件,我可以得到 ID 为 5、2、8、4 或其他值的结果。我将查询变量保存在会话中,所以如果我编辑产品 5,保存后将我带到产品 2,保存后将我带到 8 和 4。我需要一个查询来获取当前项目 ID 之后的下一行.

我用来测试以获得结果的查询是:

SELECT * FROM products WHERE `active` = 1 AND `deleted` = 0 AND (`name` LIKE '%APO%' OR `din` LIKE '%APO%') ORDER BY `name` ASC, id ASC LIMIT 0,10

我已经输入了两个搜索值,只是按名称排序。我怎样才能得到下一行等等?

【问题讨论】:

    标签: php sql mysql pagination


    【解决方案1】:

    我决定在 URL 中传递结果表中的位置。我通过检索页码,将其乘以每页的结果数,然后向其中添加一个递增变量来获得此信息。这样,上一个/下一个链接可以获取查询位置并从中添加/减去 1。结合 LIMIT 语句,这似乎是有效的。必须在 URL 中传递变量很烦人,但至少它可以工作。

    【讨论】:

      【解决方案2】:

      我会在数据库之外执行此操作。还要保存会话中一些查询 ID 的顺序吗?然后,您可以轻松地浏览它们。如果此人去使用该集合,或者您超出了存储数据集的限制,则重新发出完整查询并保存一组新结果。

      【讨论】:

        【解决方案3】:

        以下查询将返回第二个结果

        SELECT * FROM products WHERE `active` = 1 AND `deleted` = 0 AND (`name` LIKE '%APO%' OR `din` LIKE '%APO%') ORDER BY `name` ASC, id ASC LIMIT 1,1
        

        以下查询将返回第三个结果

        SELECT * FROM products WHERE `active` = 1 AND `deleted` = 0 AND (`name` LIKE '%APO%' OR `din` LIKE '%APO%') ORDER BY `name` ASC, id ASC LIMIT 2,1
        

        等等……

        或者你可以做一个临时表。临时表与数据库连接会话相关联。

        CREATE TEMPORARY TABLE list ...
        

        【讨论】:

        • 这个解决方案根本不起作用,因为我有项目 ID,而不是返回查询中的位置
        猜你喜欢
        • 2012-07-20
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 2018-07-14
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        • 2013-05-13
        相关资源
        最近更新 更多