为什么 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" 联合。
来自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;
我有 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" 联合。
来自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;