MySQL. Стол «многие ко многим». Выберите группу пользователей, которые посетили только указанную c группу других пользователей - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть таблица 'зрителей' с отношением "многие ко многим"

user_id1 - целое число - пользователи, которые совершают действие посещения

user_id2 - целое число - пользователи, профиль которых посетил

И мне нужно выбрать группу user_id1 (совершившего действие), которая посещала только определенные c профили из группы 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, который просматривал профили из user_id2 с идентификаторами, которые могут содержать '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)

1 Ответ

0 голосов
/ 19 апреля 2020

Вы можете отфильтровать таблицу по найденным идентификаторам, сгруппировать по user_id и установить условие в предложении has:

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_ids пользователей, которые посетили только этих 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       |
...