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;