【问题标题】:Pagination on with mysql queries使用 mysql 查询进行分页
【发布时间】:2017-08-19 22:57:29
【问题描述】:

我有一个系统可以自动对所有 mysql 查询使用 LIMIT 和 OFFSET 进行分页。

例子:

// Page 1
SELECT * FROM tbl_products WHERE category_id = 1 LIMIT 20 OFFSET 0

// Page 2
SELECT * FROM tbl_products WHERE category_id = 1 LIMIT 20 OFFSET 20

// Page 3
SELECT * FROM tbl_products WHERE category_id = 1 LIMIT 20 OFFSET 40

etc.

现在是问题本身。

A) 这是最好的方法吗?有其他选择吗?

B) 当我登陆一个产品页面 (products.php?id=12345) 并且在同一页面上会有一个产品列表时,如何在产品列表中选择正确的页面?如果这个产品恰好在产品列表的第 105 页?

这是为了突出显示列表中的“选定产品”。现在它只在产品恰好在第一页时才有效,第一页总是自动加载到 products.php 页面。

【问题讨论】:

  • 首先,如果您有limit 子句,则必须始终包含order by 子句。否则页面将不一致。
  • 好吧,因为这里都是伪的,所以我跳过了它。它仍然会保持一致,因为它默认按 id 或按时间顺序排序。

标签: php mysql pagination


【解决方案1】:

例如,如果您的第一页在网址 www.tst.com?page=1 中有一个 get 变量

off = (page - 1)*20 ;
row = 20;
select * from table limit (off, row);

最好你会使用这样的东西。该代码比您必须对表进行计数然后使用该计数结果作为新参数的两个查询要快得多,因为表中可能存在 n 行......表越大越少高效的查询将是。

【讨论】:

    【解决方案2】:

    A) 这是最好的方法吗?有没有替代品?

    这可能是最好的方式,因为分页由服务器执行,并且只返回所需的行。

    B) [...] 我如何在产品列表中选择正确的页面 [...]

    我能想到两种可能的解决方案:


    在您的详细信息页面中使用选择所有 ID 的查询:

    SELECT id
    FROM tbl_products
    WHERE category_id = 1
    ORDER BY id
    

    注意ORDER BY 子句...两个查询(带有LIMIT 的一个和选择所有ID 的一个)必须以完全相同的方式排序。然后,您可以使用 PHP 代码遍历所有行并找到产品 ID 所在的索引。然后用这个数字除以页面大小来确定页码。


    另一种解决方案是创建一个 MySQL 查询,对行进行编号,如下所示:

    SELECT @row_number := @row_number + 1 AS row_number, id
    FROM tbl_products, (SELECT @row_number := 0) AS temp1
    WHERE category_id = 1
    ORDER BY id
    

    将此查询嵌套在另一个查询中以确定特定 id 的行号:

    SELECT row_number FROM (
        SELECT @row_number := @row_number + 1 AS row_number, id
        FROM tbl_products, (SELECT @row_number := 0) AS temp1
        WHERE category_id = 1
        ORDER BY id
    ) AS temp2 WHERE id = 1234
    

    行号除以页面大小得到页码。

    【讨论】:

    • 第一件事就是我正在做的事情,但每次加载页面时都进行全表扫描以找出正确的页码似乎是一个糟糕的主意。 ://
    • 如果您只选择 id 数据库应该能够使用索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多