2009-12-02 47 views
0

我有三個表分別爲test1,test2的,TEST3MySQL查詢疑問

test1 data 
=========== 
id test_id q_id 
1 25  2 
2 27  2 

test2 data 
=========== 
id test_id q_id 
1 25  2 
2 34  2 

test3 data 
=========== 
id test_id q_id 
1 34  2 

怎麼弄test_id值與q_id = 2這三個表中不重複的數據?

即25,27,34

+2

爲什麼你有3個相同列的表?作爲一個帶有額外列的單個「測試」表來區分3次測試運行,這樣做會不會更好? – 2009-12-02 13:25:30

回答

2

如果你真的無法擺脫的兩三個結構相同的表看看的UNION操作。默認行爲是UNION DISTINCT可從結果中刪除重複項。

SELECT test_id FROM test1 WHERE q_id=2 
UNION DISTINCT 
    SELECT test_id FROM test2 WHERE q_id=2 
UNION DISTINCT 
    SELECT test_id FROM test3 WHERE q_id=2 
+0

這來自mysql手冊(事實上,這是SQL標準規定的行爲): UNION的默認行爲是將重複的行從結果中刪除。可選的DISTINCT關鍵字除缺省值外沒有其他作用,因爲它還指定刪除重複行。 – 2009-12-02 13:39:52

+0

是的,這是默認行爲(正如答案中已經提到的那樣),並且將它明確寫入查詢(爲了清楚起見)也沒有任何壞處。 – VolkerK 2009-12-02 13:44:16

0
SELECT test_id 
FROM (
    SELECT * FROM test1 UNION 
    SELECT * FROM test2 UNION 
    SELECT * FROM test3 
) tests 
WHERE q_id = 2 
+0

SELECT DISTINCT test_id ... – 2009-12-02 13:27:07

+3

如果您正在處理較大的表,則此查詢會導致不必要的開銷。見下面的解決方案 – 2009-12-02 13:32:25

1

@just人 - 你的查詢正在進行3 SELECT *這可能是強烈的,最好是限制所有三個,以避免行的不必要數:

SELECT test_id, 'test1' AS tableName FROM test1 WHERE q_id = 2 
    UNION 
    SELECT test_id, 'test2' AS tableName FROM test2 WHERE q_id = 2 
    UNION 
    SELECT test_id, 'test3' AS tableName FROM test3 WHERE q_id = 2 

上面的查詢是修改以反映每個q_id來自哪個表。

+0

什麼是在一個子查詢中包裝的原因是什麼? – VolkerK 2009-12-02 13:39:27

+0

是不是足夠聰明的數據庫,看到它只是需要test_id?我認爲從3.22天開始,mysql已經長大了一點......感嘆。 – 2009-12-02 13:43:45

+0

@VolkerK - 好點,我只是簡單地粘貼和修改@just某人的代碼來顯示優化。 – 2009-12-02 13:49:27