我有一个系统可以使用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页面。
答案 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行...表中的行越大越少有效的查询将是。