2011-05-08 123 views
34

我正在使用Codeigniter做分页功能,但我认为这适用于一般的PHP/mySQL编码。在偏移+限制下查找mySQL查询结果的总数

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

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

编辑:我的SQL查询使用WHERE以及选择与特定“CATEGORY_ID”

+2

太神奇了!感谢这个问题,不明白为什么它只有23个upvotes。如此根本的问题。 – Adam 2016-07-27 12:51:47

回答

6

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

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

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

+0

对不起,我忘了补充一点,我的SQL查询也使用WHERE来选择所有具有特定'category_id'的行 – Nyxynyx 2011-05-08 16:17:23

+0

nyx,不会SELECT COUNT(*)FROM table_name WHERE条件仍然有效吗? – 2011-05-08 16:18:28

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

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

+0

'SELECT COUNT(*)'是更高性能的,因为它不需要检查NULL值排除 – karmiphuc 2016-02-22 03:07:21

2

考虑到SQL_CALC_FOUND_ROWS需要调用FOUND_ROWS()后,如果您想与结果从限制返回,而不必调用第二SELECT获取总计数,我会用JOINsubquery得出结果:

SELECT * FROM `table` JOIN (SELECT COUNT(*) FROM `table` WHERE `category_id` = 9) t2 WHERE `category_id` = 9 LIMIT 50 

注:每一个派生表必须有它自己的别名,所以一定要命名连接的表。在我的例子中,我使用t2

+0

我特别喜欢这个,因为它碰到了db一次,但想知道它是否比2更“昂贵”SELECT它是一个简单的'COUNT(*)',因为它执行'JOIN'。 – 2017-03-30 11:26:51