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

Sal*_*ake 20 mysql

我有一个像这样的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
Run Code Online (Sandbox Code Playgroud)

我在查询中有很多where子句.如何改进此查询以获得完整的行数?我不想在没有LIMIT的情况下再使用一个请求.

Shu*_*ken 35

你要找的是这个

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();
Run Code Online (Sandbox Code Playgroud)


ani*_*son 7

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


小智 5

自上次回答起4年了,但这就是我解决问题的方法.尽管SaltLake的答案对我来说是个错误,但它确实让我得到了正确答案.

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

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

另一个非常重要的一点是,因为UNION正在发生,所以两个表中的列数必须相同.这通常意味着您必须使用最重要的FOUND_ROWS()值填充SECOND Select,然后填充许多NULL值.

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