2014-06-27 84 views
1

我有4個表:postsusersmentionsfollowing獲取唯一的記錄多連接用條件

posts 
---------------------------- 
id | user_id | post_text 
1  1   foo 
2  1   bar 
3  2   hello 
4  3   jason 

users 
------------ 
id | name 
1  jason 
2  nicole 
3  frank 

mentions 
-------------------------- 
id | post_id | user_id 
1  4   1 


following 
------------------------------------------------- 
id | user_id | user_id_of_user_being_followed 
1  1   2 

posts包括誰張貼一些文本 users有用戶ID的用戶的USER_ID和用戶名稱 mentions具有提及1個或更多其他用戶的任何帖子的帖子ID和用戶ID following具有用戶ID和他們正在關注的用戶(用戶可以跟隨0到很多用戶)

我想要做的就是返回給定用戶關注的用戶的所有帖子,加上任何提及該用戶的帖子(不管給定的用戶是否跟隨),而不返回任何重複。

SELECT p.id, p.post, u.name, 
FROM following f 
JOIN posts p ON f.following = p.user_id 
JOIN users u ON u.id = p.user_id 
WHERE f.user_id = :user; 

以上的回報來自給定用戶以下用戶的所有帖子,但我努力搞清楚如何包括提及以及(記住,用戶不必跟隨別人能看到他們已經提到過的帖子)。

UPDATE: 感謝John RI能想出解決辦法:如果我理解你的querstion正確你想左連接包括任何提及

SELECT DISTINCT(p.id), p.post, u.name 
FROM posts p 
LEFT JOIN following f ON f.following = p.user_id 
LEFT JOIN mentions m ON m.posts_id = p.id 
JOIN users u ON u.id = p.user_id 
WHERE (f.user_id = :user_id OR m.user_id = :user_id) 

回答

1

..但沒有過濾掉任何追隨者/張貼

,如果你可以添加一些樣本數據打與我可以確保它的工作,你怎麼想它...

SELECT 
    if(p.id is not null, p.id, p1.id) as post_id, 
    if(p.post is not null, p.post, p1.post) as post_text, 
    u.username, m.id, m.user_id 
FROM posts p 
JOIN users u on u.id = p.user_id 
JOIN following f on f.user_id_of_user_being_followed = u.id 
LEFT JOIN mentions m on m.user_id = f.user_id 
LEFT JOIN posts p1 on p1.id = m.post_id 
WHERE f.user_id = :user or m.user_id = :user; 

我在提交表中留下了加入提及,並且當提及表中的user_id等於指定的用戶以過濾掉其他用戶時。左邊的加入不應該改變返回的行數..但只有包括任何提到


編輯:WORKING FIDDLE

玩了之後,我意識到這是試圖把所有的數據到一行..試試這個:

(
    SELECT p.id, p.post_text, u.name 
    FROM posts p 
    JOIN users u on u.id = p.user_id 
    JOIN following f on f.user_id_of_user_being_followed = u.id 
    WHERE f.user_id = 1 
) 
UNION 
(
    SELECT p.id, p.post_text, u.name 
    FROM following f 
    JOIN mentions m on m.user_id = f.user_id 
    JOIN posts p on p.id = m.post_id 
    join users u on u.id = p.user_id 
    WHERE f.user_id = 1 
); 
+0

嗯,這似乎不工作,因爲我們已經限制了基於'JOIN帖子p ON f.following = p.user_id'返回的帖子 - 至少我認爲這是原因。 – kylex

+0

你能提供幾行數據供我使用嗎?我可以看到我在理論上缺少它,如果你做 –

+0

編輯原始帖子。 正如你所看到的,用戶1只跟隨用戶2,但是用戶3在用戶4中提到用戶1.因此,用戶1應該看到來自用戶2的所有帖子,以及他們被提及的帖子(如提及的表)。 – kylex

-1

也許你繼承了這個數據庫;但最後一張表並不符合良好的數據標準化。該表應該是id和following_id;按照設置,您最終會用盡列(或者在用戶發生錯誤時不得不添加它們) - 新用戶將無法關注任何人。