2011-09-06 109 views
0

我刷新我的SQL與在線斯坦福數據庫類練習,發現here。這裏的問題是:「找同學誰只是有朋友在同一檔次 的名稱和等級每 級內回到依等級排序的結果,然後按名稱。」簡單的SQL問題與子查詢

我們有一個highschooler表,用屬性namegradeid。此外,likes表具有屬性id1id2id1id2likes對應於idhighschooler

基於這個問題部分,我可以告訴我需要使用子查詢,但我不知道在哪裏。我應該如何處理這個問題?目前建議的解決方案都不起作用。

這裏是我當前的SQL語句,也就是工作不正常(忽略排序):

select distinct 
    student1.id, 
    student1.name, 
    student1.grade 
from 
    highschooler student1, 
    highschooler student2, 
    friend 
where not exists (select * 
        from friend 
        where student1.id = id1 
        and student2.id = id2 
        and student1.grade = student2.grade 
        and student1.id <> student2.id); 
+1

你可以把它想象成:「找到不存在的學生的姓名和成績 - 一個不同年級的朋友。」 –

回答

-1

這是比看起來難,因爲這需要順序準備套。但是,有幾種方法可以解決這個問題。下面是快速浮現在腦海:

首先,找朋友-的-的朋友按等級產生像大家:

[ID],[導電泡棉ID],[導電泡棉等級]

你真的不需要[FoF ID],但它可能有助於調試。

然後,作爲第二次操作中,則需要產生的[ID] S一個列表,其中[導電泡棉等級]等於兩個MAX()和MIN():

SELECT [ID],MAX(導電泡棉的級)爲A,MIN(導電泡棉的級)爲B FROM [上述]其中,A = B

UPDATE: 我發現我還應當補充一點,在最後的qry:A = B和A =等級。那麼這個解決方案的作品請記住:它只回答「找到只有同級朋友的學生的姓名和成績」的問題。它假定友誼是單向的。 (對不起,我不得不放棄一些東西。)

對於那些需要看到一些SQL的人,在這裏。它是爲MS Access編寫的,但很容易移植到MySQL,PGSQL或Oracle中(從最內層查詢中刪除「(」))。更好的是,沒有程序擴展,也沒有臨時表。

SELECT 名稱 FROM ( SELECT ID ,名稱 , 級,分鐘(friend_grade)作爲min_friend_grade ,最大值(friend_grade)作爲max_friend_grade FROM ( SELECT hs1.ID ,HS1 .name ,hs1.grade ,l.ID2 as friend_id ,hs2.name as friend_name ,hs2。級作爲friend_grade

FROM (highschooler HS1 INNER JOIN喜歡升ON(hs1.ID = l.ID1)) INNER JOIN highschooler HS2 ON(l.ID2 = hs2.ID)

)導電泡棉

GROUP BY ID ,名稱 ,等級

)FoF_max_min

WHERE grade = min_friend_grade AND min_friend_grade = max_friend_grade

0

我認爲,如果A是B的朋友,那麼等於B是A的朋友。

CREATE VIEW Temp 
AS 
    SELECT id,name,grade,id2,[grd2] FROM highschooler 
     INNER JOIN Likes ON highschooler.id = Likes.id1   
     INNER JOIN (SELECT id as [id2t], grade as [grd2] from highschooler) a ON a.id2t = Likes.id2    
    UNION ALL 
    SELECT id,name,grade,[id1] as [id2],[grd2] FROM highschooler 
     INNER JOIN Likes ON highschooler.id = Likes.id2   
     INNER JOIN (SELECT id as [id2t], grade as [grd2] from highschooler) a ON a.id2t = Likes.id1  

臨時觀點讓我有所有的信息,我需要。

CREATE VIEW PlayWithClassMate 
AS 
    SELECT distinct id FROM Temp WHERE grade = grd2 

PlayWithClassMate觀點讓我誰陪她玩所有的學生/他的同學(有些怎麼樣,我覺得一個人可以玩,所有的他/她的朋友不是他們的同班同學)。

CREATE VIEW IDResult 
AS 
    SELECT id FROM (
     SELECT id, COUNT(GRD2) as c FROM TEMP 
      WHERE id in (SELECT id FROM PlayWithClassMate) 
      GROUP BY ID) A 
    WHERE C>1 

IDResult視圖擁有所有的ID的問題問你。 現在,IDResult

選擇任何你需要的,inwhich 其ID我認爲這不是最好的,也可能是最差的,但它的工作。 (srr abt terribe grammar)