2013-03-30 147 views
1

我試圖發動選擇了加入子,但我對回報子查詢,並加入

SELECT * FROM user, follow 
WHERE user.id IN (SELECT follow FROM referent_follow WHERE referent=3) 

在上述情況下返回的是一個好問題,但我除了我所有的表遵循我不想

SELECT * FROM user, follow 
WHERE follow.user_id IN (SELECT follow FROM referent_follow WHERE referent=3) 

在上述情況下的收益是不錯,但我有另外我不想

查詢非常少的所有作品我的表用戶是第一一但我有跟隨的內容在我的結果中。

+0

你能提供樣本輸出嗎? –

回答

1

您當前的查詢結果來自兩個表的笛卡爾積:userfollow。您需要提供一個條件來加入和過濾連接的記錄。

SELECT DISTINCT a.*, b.* 
FROM user a 
     INNER JOIN follow b 
      ON a.ID = b.user_id 
     INNER JOIN referent_follow c 
      ON a.ID = c.follow 
WHERE c.referent = 3 
+0

感謝您的回答我不太好的 – Ajouve

+0

不客氣。很高興幫助! –

1

FROM A,B裝置A和B的一個交叉聯接所以在每行被匹配於每行乙
(所以totalRows = rowCount(A)*rowCount(B))。

使用的(INNER) JOIN應該工作:

SELECT * 
FROM user 
JOIN follow ON user.id = follow.user_id 
    AND user.id IN (SELECT follow FROM referent_follow WHERE referent=3) 

使用JOIN而不是IN會被告知,因爲它通常會產生更好的性能:

SELECT user.*, follow.* 
FROM user 
JOIN follow ON user.id = follow.user_id 
JOIN referent_follow ON user.id = referent_follow.follow 
WHERE referent=3 

您可能還需要一個DISTINCT爲JW建議。

+0

感謝您的回答 – Ajouve