1

我有三张桌子:

用户

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

组类型

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             | [..]

好吧,目前,我可以使用 union 从指定的组列表中找到所有用户,这就像一个“或”子句:

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

现在,我需要与 gorup 相交,找到所有类型为 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 并强制选定条目之一(ug1 和 ug2)具有 ug1.group_type_id=1 和另一个 ug2.group_type_id= 3. 这为您提供了所有 user_id,其 group_type_id 为 1 和 3。现在您有了它,您可以对您的用户表进行另一个联接,从而为您提供您正在寻找的所有结果。

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 回答