SQL для взаимного типа - PullRequest
       4

SQL для взаимного типа

0 голосов
/ 07 января 2019
match
---
id person_1_id persona_2_id liked
9  1           2            true
10 1           3            false
11 2           1            true
12 2           3            true
13 3           1            false
14 3           2            false

person_1_id нравится, а person_2_id нравится.

Как бы я запросил взаимные лайки для person id = 1? Значение 1007 * любит person_2_id и persona_2_id любит их обратно. Ожидаемый результат будет одной строкой, которая содержит person_id = 2.

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Вы можете сделать это с помощью пункта

.
SELECT DISTINCT t1.person_1_id, t1.person_2_id
from tbl t1
where exists (select null from tbl t2
  where t1.person_1_id = t2.person_2_.id and
     t1.person_2_id = t2.person_1_id and
     t2.liked = true
) and t1.liked = true;

Если вы просто хотите запросить person_1_id = 1, просто добавьте and t1.person_1_id = 1 в конец

0 голосов
/ 07 января 2019

Этот запрос даст вам результаты, которые вы хотите. Он ищет любого человека, которому person_id 1 нравится, кто любит его обратно:

SELECT persona_2_id
FROM match m
WHERE person_1_id = 1 AND
      liked = true AND
      EXISTS (SELECT *
              FROM match m1
              WHERE m1.person_1_id = m.persona_2_id AND
                    m1.persona_2_id = m.person_1_id AND
                    m1.liked = true)

Выход:

persona_2_id
2

Демонстрация на dbfiddle

0 голосов
/ 07 января 2019

Использовать самостоятельное соединение:

SELECT DISTINCT t1.person_1_id, t1.person_2_id
FROM mytable t1
INNER JOIN mytable t2 
    ON t1.person_1_id = t2.person_2_id 
    AND t1.person_2_id = t2.person_1_id
    AND t2.liked = true
WHERE t1.liked = true;

Или коррелированный подзапрос с условием EXISTS:

SELECT DISTINCT t1.person_1_id, t1.person_2_id
FROM mytable t1
WHERE 
    EXISTS (
        SELECT 1 
        FROM mytable t2 
        WHERE 
            t1.person_1_id = t2.person_2_id 
            AND t1.person_2_id = t2.person_1_id
            AND t2.liked = true
    )
    AND t1.liked = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...