2014-04-16 65 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