我有一个用户表,其中所有信息都是一对一的关系...
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,而不是属于这两个组的用户。我知道我已经盯着这个太长时间了,而且我错过了一些简单的逻辑元素,但我只是看不到它,因为我的生活。如果那里的任何人能够对我可能做错的事情有所了解,我会非常感激。
答案 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条记录的所有用户信息。