2013-04-24 113 views
2

我試圖只選擇所有三個組中的對象(1,2,3)。
與「WHERE gid IN(1,2,3)」選擇我得到一個OR選擇。我需要的是一個AND選擇。選擇WHERE IN與邏輯AND語句

OBJECT_TABLE AS o 
id | field1 | field2 | ... 

VALUES 
1, a, b 
2, c, d 
3, e, f 
... 


GROUP_XREF_TABLE AS gx 
oid | gid 

VALUES 
1, 1 
1, 2 
1, 3 
2, 2 
3, 1 
3, 2 
... 


SELECT DISTINCT o.id, gx.gid FROM `OBJECT_TABLE` AS o 
LEFT JOIN `GROUP_XREF_TABLE` AS gx ON o.id = gx.oid 
WHERE gx.gid IN (1,2,3) 

這會輸出所有行。我需要一個只輸出對象id爲1的行的WHERE子句,因爲只有該對象在所有三個組中。

它是一個較大選擇的一部分,所以它的重要性在於只應在where語句內完成(如果需要,子查詢應該沒問題)。

回答

3

下面的子查詢就會發現那些OID:S作在GX 3行:

SELECT o.id, gx.gid FROM `OBJECT_TABLE` AS o 
LEFT JOIN `GROUP_XREF_TABLE` AS gx ON o.id = gx.oid 
WHERE gx.oid IN (
    SELECT oid FROM GROUP_XREF_TABLE as gx2 
    GROUP BY oid 
    HAVING count(*) = 3) 
+1

的感謝!這應該工作,但我沒有得到任何結果。我認爲SELECT oid應該是gid? – Mike 2013-04-24 12:00:38

+0

@Mike很好的發現!我已經更新了答案。 – 2013-04-24 12:25:45

+0

我實際上不得不延長它,因爲你的查詢得到了我的任何類型的對象,只要它們是三個。我需要指定組。所以我這樣做: WHERE gx.oid IN(SELECT oid FROM GROUP_XREF_TABLE as gx2 where gid IN(1,2,3)GROUP BY oid HAVING count(*)= 3) – Mike 2013-04-24 13:23:17

0

試試這個

SELECT o.id, gx.gid FROM `OBJECT_TABLE` AS o 
    LEFT JOIN `GROUP_XREF_TABLE` AS gx ON o.id = gx.oid 
    WHERE gx.gid IN (1,2,3) 
    group by gx.gid 

DEMO HERE

+0

希望這對你有所幫助! – 2013-04-24 12:11:31

+0

我沒有低估它,但這個答案是不正確的 - 它給出了數據的正確輸出,但只是巧合。如果您將記錄(3,3)添加到GROUP_XREF_TABLE,則應該會看到1和3的行,但您不會 - 請參閱http://sqlfiddle.com/#!2/90fdf/1。 – 2013-04-24 12:34:38