Как сделать запрос для людей, которым нравятся все, кого они знают, используя `NOT EXISTS`? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь выбрать для следующих таблиц людей, которым нравятся все, кого они знают, и я должен использовать NOT EXISTS

Persons{id, name}
Knows {personA_id, personB_id}
Likes {PersonA_id, PersonB_id}

Синтаксис таблиц Knows и Likes равен PersonA likes/knows personB, где personA_id и personB_id относятся к идентификатору человека из таблицы Persons.

Я пытался решить это так:

SELECT p1.id, p2.name
FROM Persons p1, Persons p2, Knows k
WHERE k.personA_id = p1.id AND k.personB_id = p2.id
AND NOT EXISTS
(
   SELECT *
   FROM Likes l
   WHERE l.personA_id <> p1.id AND l.PersonB_id = p2.id
)

Но это не работал.

1 Ответ

1 голос
/ 28 апреля 2020

Давайте разберемся с этим

Сначала давайте составим список всех, кого знает человек

select * from knows k

Теперь давайте возьмем список знакомых людей и посмотрим, кто им нравится

select * from knows k
left join likes l on k.persona_id = l.persona_id and k.personb_id = l.personb_i

В этом списке вы найдете всех, кого они знают (k.personb_id). Если они им нравятся, l.personb_id будет соответствовать k.personb_id. Если нет, то l.personb_id будет нулевым.

Итак, теперь мы хотим получить список всех, кому нравятся все, кого они знают, другими словами, в поле l.personb_id приведенного выше запроса нет нулей.

Select * from persons p
where not exists(
select * from knows k
left join likes l on k.persona_id = l.persona_id and k.personb_id = l.personb_id
where k.persona_id = p.id and l.personb_id is null
)

Попробуйте здесь на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...