2013-04-24 115 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