【问题标题】:SQL Query to find users not having specific group id in join tableSQL 查询以查找连接表中没有特定组 ID 的用户
【发布时间】:2016-04-08 03:05:09
【问题描述】:

我有一个名为 jos_user_usergroup_map 的表,它有 2 列:user_id 和 group_id

一个用户可以是多个组的成员,因此该表中有几行,每行都有组 ID,例如

user_id|group_id
62     | 1
62     | 4
62     | 12
108    | 1

我想找到所有没有 group_id = 12 的 user_id,但这让我很头疼......

在上面的例子中,我应该只找到 user_id = 108

任何想法如何做到这一点? 任何帮助表示赞赏。

谢谢

【问题讨论】:

    标签: mysql sql select join


    【解决方案1】:

    试试这个:

    SELECT DISTINCT A.user_id
    FROM jos_user_usergroup_map A 
    LEFT OUTER JOIN jos_user_usergroup_map B ON A.user_id = B.user_id AND B.group_id = 12 
    WHERE B.user_id IS NULL;
    

    【讨论】:

    • 谢谢!您的解决方案是最适合我的解决方案 :-)
    【解决方案2】:

    使用聚合后过滤

    SELECT user_id FROM jos_user_usergroup_map 
    GROUP BY user_id
    HAVING SUM(group_id=12)=0
    

    【讨论】:

      【解决方案3】:

      我会尝试类似:

      SELECT DISTINCT `user_id`
      FROM `jos_user_usergroup_map`
      WHERE `user_id` NOT IN (
          SELECT `user_id` 
          FROM `jos_user_usergroup_map` 
          WHERE `group_id` = 12
      )
      

      或者使用exists(可能比in快):

      SELECT DISTINCT `user_id`
      FROM `jos_user_usergroup_map`
      WHERE NOT EXISTS (
          SELECT `user_id` 
          FROM `jos_user_usergroup_map` 
          WHERE `group_id` = 12 AND `user_id` = `jos_user_usergroup_map`.`user_id`
      )
      

      但是,请注意,虽然这些解决方案在逻辑上易于理解,但基于 JOIN 的答案在实践中通常要快得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-21
        • 2021-07-25
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多