0

我有一个用户表,其中所有信息都是一对一的关系......

    users table

    ------------------------
    id        |   name
    ------------------------
    800       |  Bob Smith
    801       |  Jane Doe
    802       |  Fred Flintstone
    803       |  Barney Rubble
    804       |  Marge Simpson

我还有另一个多对一关系表,其中包含所有用户到他们所属的组的用户组映射

    user_usergroup_map table

    ------------------------
    user_id   |   group_id
    ------------------------
    800       |  16
    800       |  27
    801       |  25
    801       |  27
    802       |  17
    802       |  19
    802       |  22
    802       |  25
    803       |  25
    803       |  27
    804       |  15

我正在尝试生成一组不同的用户,这些用户属于 2 个不同的组。同时,我试图将所有这些都保存在一个数组中(我将用作分页参考)。

我已经能够通过 JOIN 语句成功查询这两个表......

    $group_id1 = 25;
    $group_id2 = 27;

    $query = SELECT DISTINCT name, id FROM users INNER JOIN user_usergroup_map on user_usergroup_map.user_id=users.id WHERE group_id IN('$group_id1', '$group_id2');

但是,有了这个,我得到了一个不同的用户列表,这些用户属于 group_id 15 或 group_id 27,而不是属于这两个组的用户。我知道我已经盯着这个看太久了,我错过了一些简单的逻辑元素,但我一辈子都看不到它。如果有人可以阐明我可能做错了什么,我将不胜感激。

4

4 回答 4

1

这是“set-within-sets”查询的一个示例。我认为最好的方法是使用带有having子句的聚合,因为这是最通用的方法。

在您的情况下,查询如下所示:

select u.name, u.id
from users u join
     user_usergroups_map ug
     on ud.user_id = u.id
group by u.name, u.id
having sum(case when ug.group_id = $group_id1 then 1 else 0 end) > 0 and -- has group1
       sum(case when ug.group_id = $group_id2 then 1 else 0 end) > 0     -- has group2

如果要将其限制为这两个组而不是其他组,则可以添加以下子句:

       count(distinct ug.group_id) = 2
于 2013-05-22T00:34:02.317 回答
0

尝试...

select u.id, u.name
from users u join 
user_usergroup_map g
on u.id = g.user_id
group by u.id
having count(*) = 2;

这将为您提供在您的组映射表中有 2 条记录的所有用户信息。

于 2013-05-22T01:04:55.603 回答
0

我对 MySQL 有点生疏了,但是这样的东西应该也可以

select id, name, count(*) as cnt
from users, user_usergroup_map
where id = user_id
group by user_id
having cnt = 2;

它看起来不错(对我来说),但如果你的表很大,它在服务器上可能太难了。

于 2013-05-22T00:46:44.773 回答
0

假设您对表有一个约束,user_usergroup_map因此不能将给定用户分配给同一用户group_id两次,您可以执行以下操作:

Select ...
From users
Where id In (
            Select user_id
            From user_usergroup_map
            Where group_id In(25,27)
            Group By user_id
            Having Count(*) = 2
            )
于 2013-05-22T00:53:48.013 回答