分页与mysql查询

时间:2014-08-28 11:02:36

标签: php mysql pagination

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

示例:

// 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页面。

2 个答案:

答案 0 :(得分:1)

  

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

按页面大小划分行号以获取页码。

答案 1 :(得分:0)

例如,如果您的第一页在网址www.tst.com?page=1

中有一个get变量
off = (page - 1)*20 ;
row = 20;
select * from table limit (off, row);

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