mysql 第一张表为用户表,第二张表为用户与组织的关系表,用户与组织一对多的关系,已知多个用户组织id,查询哪些用户属于这些组织

你希望从组织 ID 为 1、2、3 的用户中查询,同时列出他们所有的组织 ID,包括那些不在 1、2、3 之中的,如 45。这样,我们需要一个两步的查询:

  1. 首先,找到组织 ID 为 1、2、3 的用户。
  2. 然后,查询这些用户所拥有的所有组织 ID。

我们可以使用子查询来实现这一点:

SQL 查询示例

SELECT u.user_id, u.user_name, GROUP_CONCAT(uo.organization_id ORDER BY uo.organization_id) AS organization_ids
FROM users u
JOIN user_organization uo ON u.user_id = uo.user_id
WHERE u.user_id IN (
    SELECT uo.user_id
    FROM user_organization uo
    WHERE uo.organization_id IN (1, 2, 3)
)
GROUP BY u.user_id, u.user_name;

解释

  1. 子查询部分SELECT uo.user_id FROM user_organization uo WHERE uo.organization_id IN (1, 2, 3) 用于找到所有组织 ID 为 1, 2, 3 的用户 ID。
  2. 主查询部分
    • JOIN 连接 users 表和 user_organization 表,以获取用户及其所有组织 ID。
    • WHERE u.user_id IN (...) 仅选择在子查询中找到的用户 ID。
    • GROUP_CONCAT(uo.organization_id ORDER BY uo.organization_id) 聚合用户的所有组织 ID,并按升序排列。

示例

假设 Alice 拥有组织 ID 1, 2, 4, 5,Bob 拥有组织 ID 2, 3,Charlie 拥有组织 ID 1, 2, 3, 4,而你查询的组织 ID 是 1, 2, 3,那么查询结果会是:

user_id user_name organization_ids
1 Alice 1,2,4,5
2 Bob 2,3
3 Charlie 1,2,3,4

在这个结果中,organization_ids 列包括用户所拥有的所有组织 ID,而不仅仅是查询条件中的那些组织 ID。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注