2013-02-23 90 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