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

时间:2010-03-13 20:00:21

标签: 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

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

5 个答案:

答案 0 :(得分:35)

您要找的是this

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();

答案 1 :(得分:7)

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

答案 2 :(得分: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 

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

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

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

答案 3 :(得分:0)

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

的解决方案
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()

答案 4 :(得分:-1)

你应该使用

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