在MySQL查询中使用SELECT和LIMIT时如何计算所有行?

我有这样的MySQL查询:

SELECT A.ID, A.NAME, B.ID, B.NAME FROM table1 A JOIN table2 B ON ( A.ID = B.TABLE1_ID ) WHERE cond1, cond2, ..., condN LIMIT 10 

我在查询中有很多where子句。 如何提高这个查询来获得全行数? 我不想在没有LIMIT的情况下再使用一个请求。

你在找什么是这个

 SELECT SQL_CALC_FOUND_ROWS A.ID, A.NAME, B.ID, B.NAME FROM table1 A JOIN table2 B ON ( A.ID = B.TABLE1_ID ) WHERE cond1, cond2, ..., condN LIMIT 10 SELECT FOUND_ROWS(); 

您可以使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()来计算执行该查询时的结果数量。 基本上,你只需在'SELECT'后添加'SQL_CALC_FOUND_ROWS',然后再运行另一个查询'SELECT FOUND_ROWS()'。 在同一查询中发送计数是不可能的,因为在查询完成之前,它无法知道计数。

这是自从上次回答以来的四年,但这是我如何解决这个问题。 虽然SaltLake的答案对我产生了一个错误,但它确实使我得到了正确的答案。

 SELECT SQL_CALC_FOUND_ROWS * FROM wholedatabase LIMIT 0,10 UNION SELECT 'TotalRows', FOUND_ROWS(), NULL, NULL, NULL, NULL ORDER BY IssueDate, VolumeNo 

UNION部分非常重要,因为它将您在SECOND Select结果中检索到的所需答案(总行数)标记在FIRST Select结果上。

另一个非常重要的问题是,由于联盟正在进行,两个表都必须有相同的列数。 这通常意味着您必须使用重要的FOUND_ROWS()值填充SECOND Select,然后填充大量的NULL值。

最终结果将是一个将返回11行信息的命令,其中一行包含总行数。 显然,当你使用结果时,你需要排除额外的TotalRows行。

来自http://is.php.net/manual/en/function.mysql-num-rows.php#83647的解决scheme

 SELECT SQL_CALC_FOUND_ROWS '0', z.id FROM zoom AS z LIMIT 0,6 UNION SELECT '1', FOUND_ROWS() ORDER BY `0` DESC , RAND() 

你应该使用

 SELECT SQL_CALC_FOUND_ROWS A.ID, A.NAME, B.ID, B.NAME, FOUND_ROWS() as rCount FROM table1 A JOIN table2 B ON ( A.ID = B.TABLE1_ID ) WHERE cond1, cond2, ..., condN LIMIT 10