查询相互喜欢?

时间:2013-02-23 15:18:06

标签: sql sql-server

我有一张桌子,上面有一个特定的人的id和他喜欢的人的身份。

喜欢

(p1,p2)
id1,id2
id2,id1
id3,id4
id3 id5

预期产出

id1,id2

我必须删除重复项,也意味着id1,id2要返回一次。

这是一个运动问题。

select hh.id, hh.name, hh.grade as gr
     , hh.id2, kk.name, kk.grade as gr1
  from ( select id, id2, grade, name 
           from highschooler ab 
              , Likes cd 
          where ab.id = cd.id1 ) hh 
     , highschooler kk 
 where hh.id2 = kk.id

此查询返回类似

的内容
  

学生ID,学生姓名,学生成绩,朋友学生喜欢,朋友姓名,朋友等级

2 个答案:

答案 0 :(得分:4)

这应该自己加入:

SELECT p.p1, p.p2
FROM Likes p
    INNER JOIN Likes p2 ON 
        p.p1=p2.p2 AND 
        p.p2=p2.p1 AND 
        p.p1<p2.p1

Sample Fiddle Demo

答案 1 :(得分:0)

我认为最好的方法是使用group by。在SQL Server中,这需要使用case语句:

with l as (
    select (case when p1 < p2 then p1 else p2 end) as pfirst,
           (case when p1 < p2 then p2 else p1 end) as psecond
    from likes
   )
select pfirst, psecond
from l
group by pfirst, psecond
having count(*) = 2

如果原始数据中有重复项,则having子句应为:

having count(distinct p1) = 2