2012-12-21 91 views
2

細胞的價值觀我有一個數據庫:比較MySQL的

Student (ID, Name, Grade) 
Likes (ID1, ID2) 

Where ID1 and ID2 in last table are foreign key referenced student(ID) 

注:喜愛程度不是相互關係,例如,它不是必需的,如果(123,456)是喜歡錶,然後( 456,123)也在Likes表中。

我必須爲以下語句編寫查詢: 「對於每一對彼此相似的學生,都會返回兩位學生的姓名和成績,並且每對只包含一次,兩個姓名按字母順序排列「。

到目前爲止,我已經給出了數據,其中ID1和ID2互相喜歡對方:

SELECT s1.ID, s1.name, s2.ID, s2.name 
FROM student s1, student s2, likes l 
WHERE s1.ID = l.ID1 AND s2.ID = l.ID2 
AND l.ID1 IN (SELECT ID2 FROM likes) 
AND l.ID2 IN (SELECT ID1 FROM likes); 

有人好心幫我如何避免重複對。

數據庫是:(如果有人需要它)

INSERT INTO `student` VALUES (1025,'John',12),(1101,'Haley',10),(1247,'Alexis',11),(1304,'Jordan',12),(1316,'Austin',11),(1381,'Tiffany',9),(1468,'Kris',10),(1501,'Jessica',11),(1510,'Jordan',9),(1641,'Brittany',10),(1661,'Logan',12),(1689,'Gabriel',9),(1709,'Cassandra',9),(1782,'Andrew',10),(1911,'Gabriel',11),(1934,'Kyle',12); 
INSERT INTO `likes` VALUES (1689,1709),(1709,1689),(1782,1709),(1911,1247),(1247,1468),(1641,1468),(1316,1304),(1501,1934),(1934,1501),(1025,1101); 

,並根據輸入的數據:

DATA我得到

1689 Gabriel  1709 Cassandra 
1709 Cassandra 1689 Gabriel 
1501 Jessica  1934 Kyle 
1934 Kyle  1501 Jessica 

理想的數據

1689 Gabriel  1709 Cassandra 
1501 Jessica  1934 Kyle 
+0

請注意,您也有一個錯誤在您的查詢:它會給假陽性時,別人喜歡的人回到插件TEAD。 –

回答

0

由於問題是「如何避免重複對。「:

你加入2個表得到的那些,他們都喜歡對方,你會得到2行每對

您可以通過對一些不同的值進行比較丟棄一個ID是一個偉大的。候選人:

select * -- put fields here 
from likes li 
join likes li2 on li2.ID1 = li.ID2 and li2.ID2 = li.ID1 
-- join 2 students here 
where li.ID1 < li.ID2 
+0

你們如何讓答案看起來很不錯並且格式化?我不知道。我已經搜索了'元'這個,但沒有幫助。你能指點我哪裏,可以教我如何格式化代碼看起來很好嗎? –

+0

@Bhavik Shah可能你正在尋找這個http://stackoverflow.com/editing-help? – Wasif

+0

@mwasif是的。究竟。非常感謝你! –

0

試試下面的查詢:

SELECT L1.* 
FROM `likes` l1 
LEFT JOIN `likes` l2 ON l1.id1 = l2.id2 AND l1.id2 = l2.id1 
WHERE l2.id2 IS NOT NULL 
GROUP BY l1.id1 - l1.id2 
HAVING l1.id1 - l1.id2 < 0