MySQL。多对多 table。 Select 一组用户只访问了特定的另一组用户

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

我有 table 'viewers' 多对多关系

user_id1 - 整数 - 做出访问操作的用户

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

而且我必须 select 组 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

我必须 select user_id1 谁查看了 user_id2 的配置文件,id 可能包含“30”“40”“50”(一次全部)

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

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)

您可以过滤table搜索到的ids,分组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;

参见demo
结果:

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

如果您想要 user_id 只访问过这 3 个用户的用户,则:

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;

参见demo
结果:

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