分页:2个查询(行数和数据)或1个更大的查询

时间:2013-07-24 20:51:10

标签: php mysqli pagination

由于我对php和mysql(i)脚本的速度和复杂性一无所知,我有这个问题:

我有一个包含3个表的数据库:

  • '产品',约9个字段。包含产品数据,例如“长”内容文本。
  • '类别'包含2个字段。包含类别名称
  • 'Productcategories'有2个字段。含哪种产品有哪些类别。每个产品都是1-3类的一部分。

为了设置分页(我需要row_count,因为我想知道最后一页是什么),我想知道最好的方法是什么,或者它取决于产品的数量(50, 100,500?)。返回的结果取决于所选类别:

"SELECT * FROM `productcategories` 
JOIN products ON products.proID = productcategories.proID 
WHERE productcategories.catID =$category";

创意1:

  • 1个查询,只选择1个字段,而不是全部。然后使用mysqli_num_rows()计算我的分页总行数。
  • 第二个查询直接选择5或10(我希望有LIMIT)产品实际显示。

创意2:

  • 只有1个查询(上面),您使用mysqli_nuw_rows()进行行计数,然后过滤掉您想要显示的行。

我不知道哪个是最好的。想法1似乎更快,因为您必须选择少量数据,但我不知道或所需的2个查询会影响速度?哪个是最快的:收集“大量”数据或进行查询? 如果我的想法完全走错了路,请随意纠正我。

2 个答案:

答案 0 :(得分:2)

通常认为最佳做法是尽可能少地返回数据,因此简短的回答是使用这两个查询。 但是,MySQL确实提供了一个有趣的函数,它允许您返回在没有limit子句的情况下返回的行计数:

FOUND_ROWS()

请记住,并非所有dbms都实现此功能,因此请小心使用。

示例:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

答案 1 :(得分:0)

使用select count(1) as count...作为总行数。然后根据需要选择数据以分页limit 0,10或类似的东西。

另外,对于总计数,您不需要加入productscategories表,因为这只会用于显示额外信息。

"SELECT count(1) as count FROM `productcategories` WHERE catID=$category";

然后是数据:

"SELECT * FROM `productcategories` 
JOIN categories ON categories.catID =  productcategories.catID 
JOIN products ON products.proID = productcategories.proID 
WHERE productcategories.catID=$category limit 0,10";

用所需的实际字段替换*会更好。