2013-02-23 72 views
3

我有一张桌子,里面有一个特定的人的ID和他喜欢的人的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 

该查询返回这样的事情

学生证,学生姓名,学生成绩,朋友学生喜欢,朋友的名字,朋友级

+1

什么[RDBMS(HTTP:// EN .wikipedia.org/wiki/Relational_database_management_system)您正在使用? 'SQL Server'? 'MySQL'? 'Oracle'? 'DB2'?等等。 – 2013-02-23 15:19:17

+0

@JW。你去那里 – Dude 2013-02-23 15:20:43

+0

显示你写的代码到目前为止尝试解决问题。 – kemiller2002 2013-02-23 15:21:37

回答

3

这应该这样做加盟本身:

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

+0

+1,很好的答案。 – 2013-02-23 15:33:26

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