将LIMIT与UNION组合使用时的MariaDB的奇怪行为

将LIMIT与UNION组合使用时的MariaDB的奇怪行为

问题描述:

SELECT `foo` 
FROM `table` 
WHERE `bar` = 'def' 
LIMIT 1500; 

...为条件(def)返回1500行。将LIMIT与UNION组合使用时的MariaDB的奇怪行为

(SELECT `foo` 
FROM `table` 
WHERE `bar` = 'abc' 
LIMIT 1000) 
UNION 
(SELECT `foo` 
FROM `table` 
WHERE `bar` = 'def' 
LIMIT 1500) 

...返回2498行,1498为第二个条件(def)。

因此,您可以通过第一个查询的输出看到,条件“def”肯定有足够的记录返回1500行。不过,与UNION结合使用时,返回的记录太少。

有没有人有指示我跟踪这种行为?

+0

我敢打赌,你将会看到他们,如果你'SELECT bar,foo'而不是'SELECT foo'(在两部分中)。然后你会看到他们发生了什么事。 –

行数可以减少,因为UNION只选择不同的结果..但你可以使用UNION ALL为让所有的结果都形成选择还包括行WITN相同的价值观

(SELECT `foo` 
FROM `table` 
WHERE `bar` = 'abc' 
LIMIT 1000) 
UNION ALL 
(SELECT `foo` 
FROM `table` 
WHERE `bar` = 'def' 
LIMIT 1500) 
+0

即使有重复:该表保存超过该查询中设置的LIMIT的10倍以上。因此,如果UNION删除重复项,则仍有足够的记录填满LIMIT。 – level20peon

+0

这将意味着子查询首先被限制,然后分组?为了获得LIMIT定义的记录的确切数量,是否有一种方法可以解决这个问题,并且所有这些记录都是唯一的? – level20peon

+0

如果你在你的情况下使用()之间的选择,那么首先查询按原样执行(选择和限制),然后执行查询(按sql分组)和UNION ..删除重复的行UNION ALL不删除重复的行。 – scaisEdge