0

由于我对 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 个查询对速度有很大影响?哪个最快:收集“大量”数据或进行查询?如果我的想法完全走错了路,请随时纠正我。

4

2 回答 2

2

通常认为最好的做法是返回尽可能少的数据,因此简短的回答是使用这两个查询。但是,MySQL 确实提供了一个有趣的函数,它允许您返回没有限制子句时会返回的行数:

FOUND_ROWS()

请记住,并非所有 dbms 都实现了这一点,因此请谨慎使用。

例子:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
于 2013-07-24T21:04:57.260 回答
0

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

此外,对于总数,您不需要加入productsorcategories表,因为这仅用于显示额外信息。

"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";

不过,将 * 替换为所需的实际字段会更好。

于 2013-07-24T20:57:33.063 回答