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 |
我有 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 |