MySQL:使用 AND 条件从组成成员中搜索组

标签 mysql sql

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

现在,当我想搜索“Ann AND 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 |
+-----------+------------------+

最佳答案

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:使用 AND 条件从组成成员中搜索组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602162/

相关文章:

sql - 如何在 MySQL 中进行 FULL OUTER JOIN?

mysql - 如何将 NOT IN 转换为 LEFT JOIN(或 NOT EXISTS)

Mysql 仅使用一张表来统计每个奖杯的条目总数

PHP PDO 没有活跃的事务

MySql Convert_tz()

具有良好键盘快捷键的 MySQL 表创建 GUI? Windows 或基于 Web

php - 使用 soundex() 或 metaphone() 创建 Mad Gab 风格短语的算法

mysql - 如何在 QueryDef 中重新定义 SQL?我有通过删除并重新创建 QueryDef 来工作的代码,但我无法让覆盖工作

sql - 在 SQL 过程中从 csv 文件中读取变量

mysql - 如何使用另一个列表中的值更新一个列表中具有 id 的行