Mysql,我使用SQL_CALC_FOUND_ROWS来获取可能的记录总数.
我如何在UNION上使用它?
现在唯一对我有用的东西,似乎有点偏离:
SELECT COUNT(*)
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A;
Run Code Online (Sandbox Code Playgroud)
要么
SELECT SQL_CALC_FOUND_ROWS *
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A;
Run Code Online (Sandbox Code Playgroud)
Joe*_*lli 16
对于UNION语句,使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()比使用简单的SELECT语句更复杂,因为LIMIT可能出现在UNION中的多个位置.它可以应用于UNION中的各个SELECT语句,也可以应用于整个UNION结果的全局.
SQL_CALC_FOUND_ROWS对于UNION的意图是它应该返回在没有全局LIMIT的情况下返回的行计数.使用UNION的SQL_CALC_FOUND_ROWS的条件是:
SQL_CALC_FOUND_ROWS关键字必须出现在UNION的第一个SELECT中.
仅当使用UNION ALL时,FOUND_ROWS()的值才是精确的.如果使用UNION without ALL,则会发生重复删除,并且FOUND_ROWS()的值仅为近似值.
如果UNION中不存在LIMIT,则忽略SQL_CALC_FOUND_ROWS并返回为处理UNION而创建的临时表中的行数.
您必须在唯一SQL_CALC_FOUND_ROWS的第一个SELECT中指定UNION;您实际上并不需要SELECT像使用COUNT(*).
举例来说,假设我们有以下LIMITed 查询:
SELECT * FROM my_table1
UNION ALL
SELECT * FROM my_table2
UNION ALL
SELECT * FROM my_table3
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)
我们可以简单地写:
SELECT SQL_CALC_FOUND_ROWS * FROM my_table1
UNION ALL
SELECT * FROM my_table2
UNION ALL
SELECT * FROM my_table3
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)
然后我们调用:
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
这避免了在您的问题和 Joe Stefanelli 的回答的评论中提到的外部查询的一些开销(尽管我并不完全相信这会是一个显着的差异)。
我认为值得重申的是,这仅在您使用UNION ALL而不是UNION- 这是因为在删除重复项之前计算行数,这意味着您将获得与FOUND_ROWS()使用UNION ALL.
| 归档时间: |
|
| 查看次数: |
7783 次 |
| 最近记录: |