2014-04-16 63 views
0

的不同总数当我运行此查询:为什么UNION SELECT用括号/括号返回行

SELECT 1, `name` FROM `table1` WHERE `reg` = 3 AND `lang` = 5 
UNION 
SELECT 2, `name` FROM `table1` WHERE `reg` = 1 AND `lang` = 2 
UNION 
SELECT 3, `name` FROM `table1` WHERE `reg` = 6 AND `lang` = 10 

它返回:Showing rows 0 - 24 (435 total, Query took 0.0110 sec)

我需要与LIMIT 5运行这些查询,所以我必须用括号每个select周围,在这种情况下,同样的查询,但与支架和限制:

(SELECT 1, `name` FROM `table1` WHERE `reg` = 3 AND `lang` = 5 LIMIT 5) 
UNION 
(SELECT 2, `name` FROM `table1` WHERE `reg` = 1 AND `lang` = 2 LIMIT 5) 
UNION 
(SELECT 3, `name` FROM `table1` WHERE `reg` = 6 AND `lang` = 10 LIMIT 5) 

返回以下:Showing rows 0 - 24 (17098 total, 0 in query, Query took 0.0020 sec)

有什么我做错了吗?

+0

不同的表? – vaultah

+0

你的两个工会并不相同。第二个在各个选择中使用“LIMIT”。 'UNION'删除重复项 - 如果您使用“UNION ALL”,会发生什么情况 –

+0

不,这是我的类型,我刚编辑过,对此感到抱歉。 – qwaz

回答

1

你的第二个查询是第一个不同,因为在你的第二个查询使用的是LIMIT 5

编辑: -

你可以试试这个:

(SELECT 1 as sort_col, `name` FROM `table1` WHERE `reg` = 3 AND `lang` = 5 LIMIT 5) 
UNION 
(SELECT 2, `name` FROM `table1` WHERE `reg` = 1 AND `lang` = 2 LIMIT 5) 
UNION 
(SELECT 3, `name` FROM `table1` WHERE `reg` = 6 AND `lang` = 10 LIMIT 5) 
ORDER BY sort_col, `name` 

来自MYSQL Docs

要使用ORDER BY或LIMIT子句对整个UNION 结果进行排序或限制,请将各个SELECT语句括起来,并在最后一个之后放置ORDER BY或LIMIT或 ORDER BY或LIMIT。

+0

不,没有我的类型,现在编辑。对不起,关于 – qwaz

+0

在你的第二个查询中,你正在使用LIMIT 5,这就是为什么你得到不同的输出。更新了我的答案! –

+0

当我运行没有限制5的第二个查询时,只有括号,结果不会改变:显示行0 - 49(总共17098,查询中0,查询花费0.0130秒) – qwaz

0

使用括号改变每个子查询

的查询分配优先的处理,同时在查询调查使用Explain YOUR_QUERY

+0

解释这两个查询似乎是绝对的相同 – qwaz

+0

你可以在每个查询中使用'order by id'来检查吗?原因是UNION生成无序结果集[mysql doc](http://dev.mysql.com/doc/refman/5.0/en/union.html) – Suketu