2010-05-06 35 views
3

我怎樣才能使這種查詢例如在MySQL查詢多個IN語句但沒有笛卡爾積

SELECT * FROM Table t 
WHERE t.a IN (1,2,3) 
AND t.b IN (4,5,6) 
AND t.c IN (7,8,9) ... 

,這樣的結果將只包含三行:

t.a|t.b|t.c 
---+---+--- 
1 | 4 | 7 
2 | 5 | 8 
3 | 6 | 9 

當然,上述查詢返回的值的所有組合中的IN子句,但我想得到只是每個元組的第一個元素匹配的元素,每個元組的第二個元素匹配的元素,等等

有沒有任何有效的方法來做到這一點?

順便說一下,這種查詢或概念有一些常見的術語?我有很難拿出有問題的標題,因爲我不能把這個變成文字..

+0

謝謝大家,正是我所期待的。 – Janne 2010-05-08 11:15:15

回答

2
SELECT * 
FROM mytable 
WHERE (a, b, c) IN ((1, 4, 7), (2, 5, 8), (3, 6, 9)) 

,或者多個索引友好的解決方案:

SELECT * 
FROM mytable 
WHERE (a, b, c) = (1, 4, 7) 
     OR (a, b, c) = (2, 5, 8) 
     OR (a, b, c) = (3, 6, 9) 

不幸的是,MySQL不使用索引在IN子句中記錄類型。

+1

哇,MySQL允許嗎?整齊! – Blorgbeard 2010-05-06 14:46:32

3

在MSSQL中,你可以這樣做:

SELECT * FROM Table t 
join (
     select 1 a, 2 b, 3 c 
    union select 4 a, 5 b, 6 c 
    union select 7 a, 8 b, 9 c 
) x on t.a=x.a and t.b=x.b and t.c=x.c 

我不知道這是否會直接翻譯成MySQL。

的簡單的方法當然會是:

SELECT * FROM Table t 
WHERE (t.a=1 and t.b=4 and t.c=7) 
    or (t.a=2 and t.b=5 and t.c=8) 
    or (t.a=3 and t.b=6 and t.c=9) 
0
select t1.a, t2.b, t3.c 
from Table t1 
inner join Table t2 on (t1.a = 1 and t2.b = 4) or (t1.a = 2 and t2.b = 5) or (t1.a = 3 and t2.b = 6) 
inner join Table t3 on (t2.b = 4 and t3.c = 7) or (t2.b = 5 and t3.c = 8) or (t2.b = 6 and t3.c = 9)