使用offset + limit查找mySQL查询中的结果总数

时间:2011-05-08 16:11:41

标签: php mysql codeigniter pagination

我正在使用Codeigniter进行分页功能,但我认为这一般适用于PHP / mySQL编码。

我正在使用偏移和限制来检索目录列表,具体取决于我每页需要多少结果。但是要知道所需的总页数,我需要知道(结果总数)/(限制)。现在我想第二次运行SQL查询然后计算所需的行数但不使用LIMIT。但我认为这似乎浪费了计算资源。

有没有更好的方法?谢谢!

编辑:我的SQL查询也使用WHERE来选择具有特定'category_id'的所有行

6 个答案:

答案 0 :(得分:31)

答案 1 :(得分:7)

SELECT COUNT(*) FROM table_name WHERE column = 'value'将很快返回匹配该条件的表中的记录总数。

数据库SELECT操作通常“便宜”(资源方面),所以不要以合理的方式使用它们。

编辑:在OP提到他们需要该功能后添加了WHERE

答案 2 :(得分:3)

考虑到documentation之后需要调用FOUND_ROWS(),如果您想要使用获取总计数,则无需调用第二个{{1我会使用从SQL_CALC_FOUND_ROWS

派生的JOIN结果
SELECT

注意:每个派生表都必须有自己的别名,因此请务必为连接的表命名。在我的示例中,我使用了SELECT * FROM `table` JOIN (SELECT COUNT(*) FROM `table` WHERE `category_id` = 9) t2 WHERE `category_id` = 9 LIMIT 50

答案 3 :(得分:0)

  

SQL_CALC_FOUND_ROWS查询修饰符和随附的FOUND_ROWS()   自MySQL 8.0.17起不推荐使用此函数,并将在   未来的MySQL版本。作为替代,考虑执行您的   使用LIMIT查询,然后使用COUNT(*)进行第二次查询   LIMIT以确定是否还有其他行。例如,   而不是这些查询:

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

改为使用以下查询:

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
  

COUNT(*)受到某些优化。 SQL_CALC_FOUND_ROWS   导致某些优化被禁用。

答案 4 :(得分:0)

您可以使用以下 2 个查询,一个是获取有限制的数据,另一个是获取匹配行的总数。

例如:

SELECT * FROM tbl_name WHERE id > 1000 LIMIT 10;
SELECT COUNT(*) FROM tbl_name WHERE id > 1000;

Mysql guide 所述,这是最优化的方式,SQL_CALC_FOUND_ROWS 查询修饰符和 FOUND_ROWS() 函数也不推荐使用强> MySQL 8.0.17

答案 5 :(得分:-1)

SELECT COUNT(id) FROM `table` WHERE `category_id` = 9

为您提供特定类别的行数。