SQL选择属于两个组的用户

时间:2018-02-15 13:06:28

标签: mysql sql

我有一张桌子上的人员名单。然后,我有另一个表格,我将每个人与一个或多个组相关联。有些人在群组表中只有一个条目,但有些人有多个条目。

我现在正在尝试选择两个特定组中的人员列表。为了符合资格,人必须在两个小组中。

我的表格中有关于人员的基本信息是基础,具有组关联的表格是groups_registration。事实上,我还有第三个表,其中存储了组名称和更多信息,但此查询不需要它。

我试图在这个例子中收集的组是4和11.

我最初尝试的是:

SELECT base.*, groups_registration.person_id, groups_registration.group_id
        FROM base
                INNER JOIN groups_registration
                        ON base.id = groups_registration.person_id
        WHERE (groups_registration.group_id = '4' AND groups_registration.group_id = '11')
        ORDER BY base.name

这没有得到我的任何回复,我假设因为没有一行包含group_id = 4和group_id 11.

我一直在搜索stackoverflow,没有任何乐趣。你们有什么想法吗?

2 个答案:

答案 0 :(得分:1)

显然,没有行都有两个值。使用group by

SELECT gr.person_id, groups_registration.group_id
FROM groups_registration gr
WHERE gr.group_id IN (4, 11)
GROUP BY gr.person_id
HAVING COUNT(DISTINCT gr.group_id) = 2;

我们会让您弄清楚如何加入base中的其他信息。

注意:

  • 使用表别名可以更轻松地编写和读取查询。
  • 据推测,ids是数字。将数字与数字进行比较仅对日期和字符串常量使用单引号。
  • IN优于OR / =的长链。

答案 1 :(得分:1)

您可以使用如下所示的联接:

SELECT A.*, B.person_id, B.group_id
FROM base A
INNER JOIN 
(SELECT gr.person_id, groups_registration.group_id
 FROM groups_registration gr
 WHERE gr.group_id IN (4, 11)
 GROUP BY gr.person_id
 HAVING COUNT(DISTINCT gr.group_id) = 2) B
 ON A.id = B.person_id;

这将为您提供所有需要的字段。