Mysql其中匹配所有

时间:2014-08-04 15:52:43

标签: mysql sql

我通过连接表在用户和组之间建立了典型的m:m关系。每个用户都可以成为多个组的一部分。

users
-------
id
name

groups
-------
id
name

user_groups
------------
id
user_id
group_id

我想尝试查找多个组中的所有用户。例如,组3,4,5中的所有用户。请注意,用户必须属于所有这些组。

首先我尝试了以下操作,但当然这不正确,因为这会返回OR结果,而不是AND

SELECT DISTINCT u.*
FROM users u
LEFT JOIN user_groups ug on u.id = ug.user_id
where ug.group_id in (3, 4, 5)

我也尝试为我正在搜索的每个group_id(有效)进行单独的连接,但效率不高。

如何才能最好地实现

3 个答案:

答案 0 :(得分:0)

尝试这样的事情

SELECT
    u.id, u.name
FROM users u
    LEFT JOIN user_groups ug on u.id = ug.user_id
WHERE ug.group_id in (3, 4, 5)
GROUP BY u.id, u.name
HAVING COUNT(u.id) = 3

GROUP BYHAVING COUNT强制查询查找所有3个组中的用户。

编辑:如果您不想使用GROUP BY一种丑陋的方式,那就是使用EXISTS

SELECT
    u.id, u.name
FROM users u
WHERE 
    EXISTS (SELECT 1 FROM user_groups ug 
            WHERE u.id = ug.user_id AND ug.group_id = 3)
    AND EXISTS (SELECT 1 FROM user_groups ug 
            WHERE u.id = ug.user_id AND ug.group_id = 4)
    AND EXISTS (SELECT 1 FROM user_groups ug 
            WHERE u.id = ug.user_id AND ug.group_id = 5)

答案 1 :(得分:0)

如果您想获得有关用户的所有信息,请尝试此操作:

select *
  from users u
  join (
       select user_id
         from user_groups
        where group_id in (3, 4, 5)
        group by user_id
       having count(*) > 1
       ) ugr on u.id = ugr.user_id

如果您希望输出如下:user_id, user_name, count(*),那么:

select u.id as user_id, u.user_name, count(*)
  from user_groups ugr
     , users u
 where u.id = ugr.user_id
   and ugr.group_id in (3, 4, 5)
 group by u.id, u.username
 having count(*) > 1

根据您的需要调整where group_id in (3, 4, 5)

答案 2 :(得分:0)

此查询应该有效,它应该返回所有常见的user_id

select user_id 
  from user_groups
 where user_id in (
         select user_id 
           from user_groups
          where group_id = 3
            and user_id in (
                  select user_id
                    from user_groups
                   where group_id = 2
                     and user_id in (
                           select user_id 
                             from groups 
                            where group_id = 1
                         )
               )
      )