【问题标题】:SQL select users that belong to two groupsSQL 选择属于两个组的用户
【发布时间】:2018-02-15 13:06:28
【问题描述】:

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

我现在正在尝试选择两个特定组中的人员列表。人必须同时在两个组中才能获得资格。

我的包含人员基本信息的表是base,具有组相关性的表是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。大家有什么想法吗?

【问题讨论】:

标签: mysql sql


【解决方案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的附加信息。

注意事项:

  • 使用表别名可以更轻松地编写和读取查询。
  • 大概,ID 是数字。将数字与数字进行比较。仅对日期和字符串常量使用单引号。
  • INOR/= 的长链更好。

【讨论】:

  • 非常感谢。这是我根本没有看到的解决方案。像魅力一样工作:)
【解决方案2】:

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

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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多