2013-12-21 23 views
0

假設你有2個表:userfriends - 你想加入所有的朋友給你查詢用戶。在SQL雙向關係有2個表,並沒有重複

明顯的答案是:

SELECT friend.uid 
FROM `user` 
JOIN friends ON user.uid = friends.user 
JOIN user AS friend ON friends.friend = friend.uid 
WHERE user.uid = $user_id 

這工作得很好,但它是一個單向的關係。爲了使這項工作,我不得不爲每個關係添加2行。

在另一方面,這是雙向的:

SELECT friend.uid 
FROM `user` 
JOIN friends ON user.uid IN(friends.col1, friends.col2) 
JOIN user AS friend ON 
    friend.uid IN(friends.col1, friends.col2) 
WHERE user.uid = $user_id AND friend.uid != user.uid 

但是,這是利用多個IN()的s是不是很乾淨,很可能帶有一個很大的性能損失。

還有沒有其他的方法可以做到這一點?

+0

可以請你展示表模式和樣本數據的輸入和輸出嗎? – OldProgrammer

回答

1

您只需使用UNION ALL並跳過完全的加入,類似;

SELECT friends.col1 friend_uid FROM friends WHERE friends.col2 = $user_id 
UNION ALL 
SELECT friends.col2   FROM friends WHERE friends.col1 = $user_id 
+0

不是工會表演豬嗎? –

+0

@JV這真的取決於rdbms,但'UNION ALL'與'UNION'相比是一個相當簡單的操作。 –

+0

啊我明白了。我認爲性能規模很奇怪,因爲有大量的表格,但我並沒有一大堆表格。如果我需要關於來自用戶表的朋友的其他數據,那麼會如何影響性能? –