2

3 つのグループ (1、2、3) すべてに含まれるオブジェクトのみを選択しようとしています。
「WHERE gid IN (1,2,3)」を選択すると、OR 選択が取得されます。必要なのは 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 句が必要です。そのオブジェクトのみが 3 つのグループすべてに含まれているからです。

より大きな選択の一部であるため、これは where ステートメント内でのみ実行することが重要です (必要に応じて、サブ選択で問題ありません)。

4

2 に答える 2

3

以下のサブセレクトは、gx に 3 行ある oid: を見つけます。

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)
于 2013-04-24T11:55:38.910 に答える