2017-08-16 264 views
1
SELECT posts.id, posts.body, posts.posted_at, posts.likes, posts.dislikes, users.`userName` 
FROM users,posts,interests 
WHERE (posts.user_id =3 
OR interests.follower_id =3 AND posts.topics IN(SELECT interest_id FROM interests WHERE follower_id = 3)) 
AND users.ID = posts.user_id 
AND posts.topics = interests.interest_id 
ORDER BY posts.posted_at DESC 

當user_id = 3是興趣表中某個主題後面的唯一人員時,此查詢正常工作。興趣表包括id,follower_id和(interest_id,其是諸如運動的主題)。SQL查詢從表中獲取記錄

posts表中包含一個主題列,用戶可以關注主題,一旦您按照主題將其插入到興趣表中。現在我試圖檢索用戶發佈的帖子,我希望獲得的帖子可以是我發佈的帖子(在帖子中有一列叫做user_id,它是發佈它的用戶的ID),也可以是我的主題帖子以下。

這裏的問題是當我運行這個查詢時,我得到重複的帖子,因爲一些其他用戶正在關注同一主題。

回答

1

如果您不查詢interests的任何字段,則可能不應該加入聯接。將其用法轉換爲inexists條件將消除您的重複項。另外,您應該注意隱式聯接(即列出from子句中的多個表)被認爲是不好的做法,您應該使用顯式聯接來代替:

SELECT posts.id, posts.body, posts.posted_at, posts.likes, posts.dislikes, 
     users.userName 
FROM  posts 
JOIN  users ON users.id = posts.user_id 
WHERE posts.user_id = 3 OR 
     posts.topics IN (SELECT interest_id 
          FROM interests 
          WHERE follower_id = 3) 
ORDER BY posts.posted_at DESC