为什么 2 个使用联合限制的语句不获取所有记录?

why does 2 statements with limits using unions does not acquire all records?

我有 2 个带有限制和联合的语句,但是当我 运行 语句时,我只得到定义为最高限制的结果数。我以为我会从陈述 1 得到 X 结果,再加上从陈述 2 得到 Y 结果。这并没有发生。这是为什么?

查询示例如下:

SELECT * FROM tableA WHERE X > 100 LIMIT 2
UNION
SELECT * FROM tableA WHERE X < 100 LIMIT 3;

上面的查询 returns 3 个结果。然而,在这个简单的示例中,我想要 2 个结果 + 3 个结果(总共 5 个结果)。

如果我像这样修改查询,我得到了 5 个结果,但下面的查询似乎具有误导性:

SELECT * FROM tableA WHERE X > 100 LIMIT 2
UNION
SELECT * FROM tableA WHERE X < 100 LIMIT 5;

我发现通过将每个语句包装在另一个语句中可以解决此问题。以下是最终声明的显示方式:

SELECT * FROM(
    SELECT * FROM tableA WHERE X > 100 LIMIT 2
)query1
UNION
SELECT * FROM(
    SELECT * FROM tableA WHERE X < 100 LIMIT 3
)query2;

感谢任何可以解释为什么最初两个语句的行为的人。

除非使用括号,否则最终的 ORDER BY and/or LIMIT 子句将作为一个整体应用于查询 "outside/after" 联合。

http://dev.mysql.com/doc/refman/5.7/en/union.html

来自https://dev.mysql.com/doc/refman/5.7/en/union.html

To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

第一个示例中的 LIMIT 应用于整个外部查询。我添加了一些括号以使正在发生的事情更加明显。

(SELECT * FROM tableA WHERE X > 100 LIMIT 2
 UNION
 SELECT * FROM tableA WHERE X < 100) 
LIMIT 3;