我有一个像这样的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的情况下再使用一个请求。
答案 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)
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