MySQL的。多对多表。选择仅访问其他用户的特定组的用户组

MySQL. Many-to-many table. Select group of users who visited only specific group of another users

提问人:Volodymyr 提问时间:4/19/2020 更新时间:4/19/2020 访问量:25

问:

我有具有多对多关系的表“查看器”

user_id1 - 整数 - 执行访问操作的用户

user_id2 - 整数 - 其个人资料访问过的用户

我必须选择一组user_id1(谁采取了行动),他们只访问了user_id2组中的特定个人资料

EXAMPLE DATASET

> user_id1 |  user_id2
> 
> 1  | 30
> 
> 1  | 40
> 
> 1  | 50
> 
> 2  | 30
> 
> 2  | 40
> 
> 10 | 40
> 
> 10 | 50
> 
> 11 | 30
> 
> 11 | 40
> 
> 11 | 50
> 
> 12 | 50
> 
> 12 | 60
> 
> 12 | 70
> 
> 13 | 30
> 
> 13 | 40
> 
> 13 | 50
> 
> 13 | 60
> 
> 14 | 90
> 
> 14 | 95
> 
> 14 | 98

我必须选择user_id1从ID可能包含“30”、“40”、“50”(一次)的user_id2查看个人资料的人

我试图让它像,但它不起作用

SELECT
t.user_id1,
t.user_id2
FROM viewers t
WHERE 
t.user_id2 in (select distinct t.user_id2 from viewers t WHERE t.user_id2 = 30)
AND  t.user_id2 in (select distinct t.user_id2 from viewers t WHERE t.user_id2 = 40)
AND  t.user_id2 in (select distinct t.user_id2 from viewers t WHERE t.user_id2 = 50)
MySQL 选择 对多

评论


答:

0赞 forpas 4/19/2020 #1

您可以筛选表中的搜索 ID,按user_id分组,并在 having 子句中设置条件:

select user_id1
from viewers
where user_id2 in (30, 40, 50)
group by user_id1
having count(distinct user_id2) = 3;

观看演示
结果:

| user_id1 |
| -------- |
| 1        |
| 11       |
| 13       |

如果您想要仅访问这 3 个用户的用户user_ids,则:

select user_id1
from viewers
group by user_id1
having count(distinct user_id2) = 3
   and sum(user_id2 not in (30, 40, 50)) = 0;

观看演示
结果:

| user_id1 |
| -------- |
| 1        |
| 11       |