繁体   English   中英

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

[英]Find total number of results in mySQL query with offset+limit

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

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

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

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

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

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

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

考虑到SQL_CALC_FOUND_ROWS需要在之后调用FOUND_ROWS() ,如果您想使用从限制返回的结果获取总计数而不必调用第二个SELECT ,我将使用从子查询派生的JOIN结果:

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

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

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 会导致一些优化被禁用。

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

前任:

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

正如所描述的Mysql导向,这是最优化的方式,并且还SQL_CALC_FOUND_ROWS查询改性剂和FOUND_ROWS()函数被弃用的MySQL 8.0.17的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM