1

私は3つのテーブルを持っています:

ユーザー

id | name
------------------
1  | Foo
2  | Bar
3  | Baz

group_type

id | name
------------------
1  | Group 1
2  | Group 2
3  | Group 3
4  | Group 4
5  | Group 5

ユーザー・グループ

id | user_id | group_type_id | [..]
------------------------------------
1  | 1       | 1             | [..]
2  | 1       | 3             | [..]
3  | 2       | 1             | [..]
4  | 1       | 5             | [..]
5  | 2       | 3             | [..]
6  | 3       | 3             | [..]

さて、現在、指定されたグループのリストから、「or」句のようなユニオンを使用してすべてのユーザーを見つけることができます。

SELECT u.*
FROM   user u,
       user_group ug
WHERE  ug.user_id = u.id
       AND ug.group_type_id IN( 1, 3, 5 )  

結果:

id | name
------------------
1  | Foo
2  | Bar
3  | Baz

ここで、グループを交差させ、タイプ 1 と 3 のグループを持つすべてのユーザーを見つける必要があります。結果は次のとおりです。

id | name
------------------
1  | Foo
2  | Bar

いくつかのクエリを試しましたが、これを正しく行う方法を想像できません。

4

3 に答える 3

3
SELECT u.id, u.name
FROM user u 
INNER JOIN user_group g 
  ON u.id = g.user_id 
WHERE ug.group_type_id IN (1,3) 
GROUP BY u.id, u.name 
HAVING count(distinct ug.group_type_id) = 2 

通常の場合ほどきれいではありませんが、確かに可能です。

于 2013-05-16T14:53:27.370 に答える
1

INTERSECT クエリを使用してみてください。SQL INTERSECT クエリの構文は次のとおりです。

select field1, field2, ... field_n
from tabl,tab2...
INTERSECT
select field1, field2, ... field_n
from tablel,table2...
于 2013-05-16T14:51:34.577 に答える
0

私の構文が完璧かどうかはわかりませんが、user_id を使用して user_group をそれ自体に自己結合させ、選択したエントリの 1 つ (ug1 と ug2) に ug1.group_type_id=1 と ug2.group_type_id= を強制することをお勧めします。 3. これにより、group_type_id として 1 と 3 を持つすべての user_id が得られます。これで、ユーザー テーブルに別の結合を実行して、探していたすべての結果を得ることができます。

SELECT u.* 
FROM user u 
JOIN (SELECT ug1.user_id 
    FROM user_group ug1 JOIN user_group ug2 
    ON ug1.user_id=ug2.user_id
    WHERE ug1.group_type_id=1 and ug2.group_type_id=3) ug
ON u.id=ug.user_id
于 2013-05-16T15:08:23.810 に答える