Postgres查询以基于两个不同的行选择值

时间:2020-07-12 00:13:26

标签: sql postgresql

因此,我正在制作一个约会应用程序,将用户滑动存储在滑动表中。

每次滑动都是一行。我想要一个查询,该查询将返回特定用户的所有匹配项。

例如:用户1在用户2上滑动,所有者列将包含ID 1和目标ID2。如果用户2在用户1上滑动,则将有另一行,其中用户2是所有者,目标1。 >

由于两个用户互相刷过对方,所以他们匹配了。我需要查询以查找特定用户ID的所有匹配项

我该怎么做?

+-------+--------+
| owner | target |
+-------+--------+
| A     | B      |
+-------+--------+
| B     | A      |
+-------+--------+
| C     | X      |
+-------+--------+
| D     | E      |
+-------+--------+
| E     | Y      |
+-------+--------+

如果以上是您的表结构,则在上述情况下,A和B是匹配项。

2 个答案:

答案 0 :(得分:1)

您可以使用EXISTS条件

select t1.owner, t1.target
from the_table t1
where exists (select *
              the_table t2
              where t1.owner = t2.target
                and t1.target = t2.owner);

答案 1 :(得分:0)

另一种选择是自我加入。

select s1.owner  
     , s1.target
   from swipe s1 
   join swipe s2 
     on (    s2.owner = s1.target
         and s1.owner = s2.target
        ) 
  order by s1.owner; 

这将为每组产生2行。对于此特定数据(A与B)和(B与A)。如果您只想使用一组组合,请添加where子句以删除其中之一。

select s1.owner  
     , s1.target
   from swipe s1 
   join swipe s2 
     on (    s2.owner = s1.target
         and s1.owner = s2.target
        ) 
  where s1.owner < s2.owner
  order by s1.owner;