如何使用UNION在查询上实现SQL_CALC_FOUND_ROWS?

Ita*_*vka 7 mysql count

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

从FOUND_ROWS()文档:

对于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而创建的临时表中的行数.


Ste*_*teJ 5

您必须在唯一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.