用于相互相似的SQL

用于相互相似的SQL,sql,postgresql,Sql,Postgresql,person\u 1\u id是喜欢的,而person\u 2\u id是被喜欢的 如何查询个人id=1的共同喜好?意思是说person\u 1\u id=1喜欢person\u 2\u id和persona\u 2\u id喜欢他们回来。预期结果将是一行,其中包含person\u id=2使用自联接: match --- id person_1_id persona_2_id liked 9 1 2 true 10 1 3

person\u 1\u id
是喜欢的,而
person\u 2\u id
是被喜欢的

如何查询
个人id=1
的共同喜好?意思是说
person\u 1\u id=1
喜欢
person\u 2\u id
persona\u 2\u id
喜欢他们回来。预期结果将是一行,其中包含
person\u id=2

使用自联接:

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
或者存在具有
条件的相关子查询

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;

如果您只想查询person_1_id=1,那么只需将
和t1.person_1_id=1
添加到末尾

此查询将为您提供所需的结果。它查找
person\u id
1喜欢的任何人,这些人也同样喜欢他们:

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;
输出:

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