Php MySQL将多个WHERE子句添加到同一列

Php MySQL将多个WHERE子句添加到同一列,php,mysql,Php,Mysql,我有一个用户表,其中所有信息都是一对一的关系 users table ------------------------ id | name ------------------------ 800 | Bob Smith 801 | Jane Doe 802 | Fred Flintstone 803 | Barney Rubble 804

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

    users table

    ------------------------
    id        |   name
    ------------------------
    800       |  Bob Smith
    801       |  Jane Doe
    802       |  Fred Flintstone
    803       |  Barney Rubble
    804       |  Marge Simpson
我还有另一个多对1关系表,其中包含所有用户到他们所属组的用户组映射

    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
我试图生成一个不同用户数组,这些用户是两个不同组的一部分。同时,我试图将所有这些都保存在一个数组中(我将使用它作为分页引用)

我已经能够通过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');
然而,通过这个,我得到了一个属于组15或组27的用户的不同列表,而不是属于这两个组的用户。我知道我已经盯着这个太久了,我错过了一些简单化的逻辑元素,但我就是看不到它,我的生活。如果有人能解释一下我可能做错了什么,我将不胜感激。

这是一个“集合内集合”查询的示例。我认为最好的方法是使用带有
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

我对MySQL有点生疏,但类似的东西也应该可以使用

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

(对我来说)这看起来不错,但如果您的表很大,服务器上可能会太难操作。

假设您对
user\u usergroup\u map
表有限制,使得给定用户不能被分配到相同的
group\u 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
            )
试试看


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

这工作做得很好!最重要的是,这还允许一个更简单、可扩展的订购系统。谢谢你的帮助!
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;