MySQL多个WHERE子句到同一列

时间:2013-05-21 22:27:49

标签: php mysql

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

    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');

然而,通过这个,我获得了一个明显的用户列表,这些用户属于EITHER group_id 15或group_id 27,而不是属于这两个组的用户。我知道我已经盯着这个太长时间了,而且我错过了一些简单的逻辑元素,但我只是看不到它,因为我的生活。如果那里的任何人能够对我可能做错的事情有所了解,我会非常感激。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我对MySQL有点生疏,但是这样的东西应该也能正常工作

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

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

答案 2 :(得分: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
            )

答案 3 :(得分: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条记录的所有用户信息。