2013-02-16 33 views
0

麻煩我有這些表:SQL查詢我在與

Highschooler(ID,姓名,年級) 有一個高中學生,唯一的ID,並在一定的等級給定的名字。

朋友(ID1,ID2) ID1的學生是ID2的學生的朋友。友誼是相互的,所以如果(123,456)在朋友表中,那麼(456,123)。

贊(ID1,ID2) ID1的學生喜歡ID2的學生。喜歡某人不一定是相互的,所以如果(123,456)在喜歡錶中,則不能保證(456,123)也存在。

如果兩個學生A和B是朋友,而A喜歡B而不是反之亦然,我想刪除喜歡元組。

要開始,我試圖想起來的2元組非互惠喜歡誰都是朋友,但我沒有成功...

我有這樣的:

SELECT * 
FROM Likes 
where Likes.ID1 in (
    select Likes.ID1 
    from Likes, Friend 
    where Likes.ID1=Friend.ID1 
    and Likes.ID2=Friend.ID2 
    ) 
AND NOT IN (
    SELECT Likes.ID1 
    FROM Likes L1, Likes L2, Friend 
    WHERE L1.ID1=Friend.ID1 
    AND L2.ID2=Friend.ID2 
    AND L1.ID1 = L2.ID2 
    AND L1.ID2 = L2.ID1); 

但它不工作..我得到一個錯誤..有人可以幫助我這個!

其實,我與它的值表的圖像,但是,因爲我需要超過10聲譽做,我不能將它張貼...

編輯:

好吧,我「M要去把表中這裏是因爲我仍然沒有得到正確的結果

Highschooler 
ID name grade 
1510 Jordan 9 
1689 Gabriel 9 
1381 Tiffany 9 
1709 Cassand 9 
1101 Haley 10 
1782 Andrew 10 
1468 Kris 10 
1641 Brit 10 
1247 Alexis 11 
1316 Austin 11 
1911 Gabriel 11 
1501 Jessica 11 
1304 Jordan 12 
1025 John 12 
1934 Kyle 12 
1661 Logan 12 


Friend 
ID1 ID2 
1510 1381 
1510 1689 
1689 1709 
1381 1247 
1709 1247 
1689 1782 
1782 1468 
1782 1316 
1782 1304 
1468 1101 
1468 1641 
1101 1641 
1247 1911 
1247 1501 
1911 1501 
1501 1934 
1316 1934 
1934 1304 
1304 1661 
1661 1025 
1381 1510 
1689 1510 
1709 1689 
1247 1381 
1247 1709 
1782 1689 
1468 1782 
1316 1782 
1304 1782 
1101 1468 
1641 1468 
1641 1101 
1911 1247 
1501 1247 
1501 1911 
1934 1501 
1934 1316 
1304 1934 
1661 1304 
1025 1661 

Likes 
ID1 ID2 
1689 1709 
1709 1689 
1782 1709 
1911 1247 
1247 1468 
1641 1468 
1316 1304 
1501 1934 
1934 1501 
1025 1101 

我應該消除到底從喜歡錶中的這些2元組: 1911年至1247年 1641年至1468年

他們是不可逆喜歡誰也朋友

+0

你使用的是mysql還是sqlite? – 2013-02-16 21:20:06

+0

我正在使用sqlite – 2013-02-16 21:25:25

+0

您的意思是,「如果兩個學生A和B是朋友,並且A喜歡B但反之亦然,我想刪除朋友元組。」? – 2013-02-16 21:26:18

回答

1

既然你是在爲這個問題做斯坦福大學入門課程,我將包括我的工作答案。如果提到它必須在SQlite中工作,這將是一個好主意。我是一名SQL初學者,我很肯定有一個更優雅的解決方案,但是這應該通過自動化測試。這裏是我的解決方案:

DELETE FROM likes 
WHERE likes.id1 in (Select s1.id 
FROM highschooler s1, highschooler s2, friend, likes 
WHERE s1.id <> s2.id 
    AND friend.id1 = s1.id 
    AND friend.id2 = s2.id 
    AND likes.id1 = s1.id 
    AND likes.id2 = s2.id 
    AND s2.id NOT IN (SELECT s3.id FROM likes, highschooler s3, highschooler s4 
        WHERE s3.id = s2.id 
         AND s4.id = s1.id 
         AND s3.id <> s4.id 
         AND likes.id1 = s3.id 
         AND likes.id2 = s4.id)) 
0

試試這個

SELECT * 
FROM Likes 
where Likes.ID1 in 
       (select Likes.ID1 from Likes, Friend where Likes.ID1=Friend.ID1 and Likes.ID2=Friend.ID2) 
    AND Likes.ID1 NOT IN (SELECT Likes.ID1 FROM Likes L1, Likes L2, Friend WHERE L1.ID1=Friend.ID1 AND L2.ID2=Friend.ID2 AND L1.ID1 = L2.ID2 AND L1.ID2 = L2.ID1); 
+0

我試過了,它沒有工作..我編輯我的帖子,包括實際值和預期的結果表 - – 2013-02-16 22:19:26

0

你的錯誤是因爲你需要重複第二和狀況Likes.ID1領域。

SELECT * 
FROM Likes 
where Likes.ID1 in (select Likes.ID1 
        from Likes, Friend 
        where Likes.ID1=Friend.ID1 and Likes.ID2=Friend.ID2) 
    AND Likes.ID1 NOT IN (SELECT Likes.ID1 
      FROM Likes L1, Likes L2, Friend 
      WHERE L1.ID1=Friend.ID1 
       AND L2.ID2=Friend.ID2 
       AND L1.ID1 = L2.ID2 
       AND L1.ID2 = L2.ID1); 

我沒有分析您的查詢是否會返回正確的結果。這可能不過,

select * 
from Likes L1 
    inner join Friend on L1.ID1 = Friend.ID1 
    left outer join Likes L2 on Friend.ID2 = L2.ID1 and L1.ID1 = L2.ID2 
where L2.ID2 is null 
+0

我試過了,它沒有工作..我編輯我的帖子,以包括表實際值和預期結果 – 2013-02-16 22:12:44

+0

嗯,我希望你看到這個想法。首先找到所有的喜歡。然後找到liker的所有朋友。然後搜索所有朋友喜歡的人,包括這次缺少的結果。然後where子句只返回最後一個缺失的結果。 – 2013-02-17 12:53:11

0

雖然這不正是發現錯誤在您的查詢,我會做這樣的:

SELECT * 
FROM Likes L1 
WHERE 
EXISTS (-- friendship exists 
    SELECT * 
    FROM Friends F 
    WHERE F.ID1 IN (L1.ID1, L1.ID2) AND F.ID2 IN (L1.ID1, L1.ID2) 
) 
AND NOT EXISTS (-- reverse like does not exist 
    SELECT * 
    FROM Likes L2 
    WHERE L1.ID1 = L2.ID2 AND L1.ID2 = L2.ID1 
); 

注意的朋友AB秩序LikesFriends能有所不同,所以我們需要JOIN使用IN像我這樣做,或OR聲明。

+0

我試過了,它沒有工作..我編輯我的帖子,以包括實際值和預期的結果 – 2013-02-16 22:24:28

+0

你能提供更多的詳細信息什麼不工作確切嗎? – Bulat 2013-02-17 06:16:15