【问题标题】:MySQL: Search group from constituent members using AND conditionMySQL:使用 AND 条件从组成成员中搜索组
【发布时间】:2016-06-04 06:17:21
【问题描述】:

以下三个 SQL 表描述了谁属于哪个组。例如,Ann 属于 A/B 组,Ben 属于 B/C 组,Chris 属于 A/C 组。

现在,当我想搜索“Ann 和 Ben 都属于的组”时,我们应该如何编写 SELECT 查询?还是我们应该以不同的方式设计这些表格?

(1) 个用户


+-----------+------------------+
| member_id | member_name      |
+-----------+------------------+
|         1 | Ann              |
|         2 | Ben              |
|         3 | Chris            |
+-----------+------------------+

(2) 组


+-----------+------------------+
| group_id  | group_name       |
+-----------+------------------+
|         1 | Group A          |
|         2 | Group B          |
|         3 | Group C          |
+-----------+------------------+

(3) 个用户组


+-----------+------------------+
| group_id  | user_id          |
+-----------+------------------+
|         1 |                1 |
|         2 |                1 |
|         2 |                2 |
|         3 |                2 |
|         1 |                3 |
|         3 |                3 |
+-----------+------------------+

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT group_id, group_name 
    FROM groups
    JOIN users_groups ON groups.group_id = users_groups.group_id
    JOIN users ON users_groups.user_id = users.member_id
    WHERE member_id = 1
    INTERSECT 
    SELECT group_id, group_name 
    FROM groups
    JOIN users_groups ON groups.group_id = users_groups.group_id
    JOIN users ON users_groups.user_id = users.member_id
    WHERE member_id = 2
    

    这将给出 Ann 和 Ben 所在的所有组的组 id 和名称。如果您想按他们的名字而不是他们的 id 进行搜索,请随意将 member_id = # 子句替换为 member_name = 'name'。

    编辑:我忘记了 MySQL 没有 INTERSECT。因此,上面的内容适用于大多数 DBMS,但下面的内容应该为 MySQL 返回所需的结果。

    SELECT groups.group_id, groups.group_name 
    FROM groups
    JOIN users_groups ON groups.group_id = users_groups.group_id
    JOIN users ON users_groups.user_id = users.member_id
    WHERE member_id = 1
    AND groups.group_id IN (SELECT groups.group_id
                            FROM groups
                            JOIN users_groups ON groups.group_id = users_groups.group_id
                            JOIN users ON users_groups.user_id = users.member_id
                            WHERE member_id = 2)
    

    【讨论】:

    • 感谢您的回答,但似乎我们不能在 MySQL 中使用“intersect”。你知道怎么做吗?
    • 哦,对了。我忘记了 MySQL 是.. 很奇怪,因为 DBMS 去。我将使用解决方法编辑我的答案。
    • 感谢您提供替代解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多