Php 使用mysql查询进行分页

Php 使用mysql查询进行分页,php,mysql,pagination,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 catego

我有一个系统,可以自动使用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页面。

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

off = (page - 1)*20 ;
row = 20;
select * from table limit (off, row);
你最好使用这样的东西。这段代码比两个查询要快得多,在两个查询中,您必须对表进行计数,然后将该计数结果用作新参数,因为表中可能有n行。。。表越大,查询效率越低

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

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

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

我可以想出两种可能的解决办法:

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

选择id 来自tbl_产品 其中category_id=1 按id订购 注意ORDERBY子句。。。这两个查询—带限制的查询和选择所有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的行号:

从中选择行号 选择@row\u number:=@row\u number+1作为row\u编号,id 从tbl_产品中,选择@row_number:=0作为temp1 其中category_id=1 按id订购 与temp2相同,其中id=1234
将行号除以页码。

首先,如果有limit子句,则必须始终包含order by子句。否则页面将不一致。因为这里的所有内容都是伪的,所以我跳过了它。它仍然是一致的,因为默认情况下它是按id或时间顺序排序的。第一件事基本上是我正在做的事情,但每次加载页面时都进行完整的表扫描,只是为了找出正确的页码,这似乎是一个糟糕的主意/如果只选择id,则数据库应该能够使用索引。