2012-05-13 268 views
3

這4個領域是相互關聯的MySQL的相關領域

Friends - posts - users - feeds

我希望它輸出爲:enter image description here

在我查詢

SELECT users.firstname, users.lastname, users.screenname, posts.post_id, posts.user_id, 
posts.post, posts.upload_name, posts.post_type, 
DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
COUNT(NULLIF(feeds.user_id, ?)) AS everybody, SUM(feeds.user_id = ?) AS you, 
GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
      CONCAT_WS(' ', likes.firstname, likes.lastname) 
        END 
      ) as names 
FROM website.users users 
INNER JOIN website.posts posts ON (users.user_id = posts.user_id) 
LEFT JOIN website.feeds feeds ON (posts.post_id = feeds.post_id) 
LEFT JOIN website.users likes ON (feeds.user_id = likes.user_id) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC 

現在,我遇到問題,我應該加入朋友表, 我想顯示來自friend_id或user_id的所有帖子以及當前登錄的用戶的帖子。如果沒有朋友匹配好友表,那麼只輸出用戶的所有帖子。請大家,我需要你的幫助。

friends.friend_id =朋友當前用戶的

用戶的

friends.user_id =當前朋友

因此,friends.friend_id = posts.user_id或friends.user_id = posts.user_id

如果我的朋友表不可理解,請幫我改變它以使其更好。

+0

請更好地解釋你想達到什麼,以及朋友如何與用戶和帖子相關... – aleroot

+0

朋友表與用戶和帖子有關。 friends.friend_id = posts.user_id = users.user_id 帖子中的所有帖子都將使用ff條件輸出: 1.)如果friends.friends_id或friends.user_id匹配posts.user_id 2.)如果不匹配那麼只需從posts.user_id =當前記錄的用戶中選擇所有帖子。 –

+0

'feeds'如何與其他表相關?如何在'feeds'中區分'you'和'everybody'? – vyegorov

回答

2

你想看到的帖子來自用戶,或從他的朋友。因此,而不是與用戶的加盟,攜手同子查詢,像這樣:

SELECT users.firstname, users.lastname, users.screenname, 
     posts.post_id, posts.user_id, posts.post, posts.upload_name, 
     posts.post_type, DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
     COUNT(NULLIF(feeds.user_id, ?)) AS everybody, 
     SUM(feeds.user_id = ?) AS you, 
     GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
      CONCAT_WS(' ', likes.firstname, likes.lastname) END) as names 
    FROM (SELECT user_id FROM website.users WHERE user_id = ? 
     UNION ALL 
     SELECT user_id FROM website.friends WHERE friend_id = ? 
     UNION ALL 
     SELECT friend_id FROM website.friends WHERE user_id = ?) AS who 
    JOIN website.users users ON users.user_id = who.user_id 
    JOIN website.posts posts ON users.user_id = posts.user_id 
    LEFT JOIN website.feeds feeds ON posts.post_id = feeds.post_id 
    LEFT JOIN website.users likes ON feeds.user_id = likes.user_i) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC; 

測試輸出here

+0

仍然有什麼問題,但我認爲在這部分'SELECT friend_id從網站。朋友WHERE friends.user_id =?'**如果用戶是朋友,另一個登錄,用戶可以查看帖子的用戶?** - 當我測試你的代碼時,它似乎只是在friend_id和user_id的邏輯部分是正確的。如果friend_id!= user_id比用戶的所有帖子都將只關於他的帖子。 –

+0

我的意思是例子'A和B'。如果** A **是** B **的朋友,那麼** A **現在是user_id和** B **是friend_id。如果** B **登錄,他將無法查看** A **的帖子。 –

+0

爲什麼不呢? ** B **將使用另一個會話,我沒有看到任何問題。這可能取決於您如何爲此查詢指定'user_id'的邏輯。 – vyegorov

2

如果我很清楚你要根據朋友= USER_ID加入朋友表,如果不匹配JOIN在朋友表user_ID的,所以你可以用這樣的嘗試:

SELECT users.firstname, users.lastname, users.screenname, posts.post_id, posts.user_id, 
posts.post, posts.upload_name, posts.post_type, 
DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
COUNT(NULLIF(feeds.user_id, ?)) AS friends, SUM(feeds.user_id = ?) AS you, 
GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
      CONCAT_WS(' ', likes.firstname, likes.lastname) 
        END 
      ) as names 
FROM website.users users 
INNER JOIN website.posts posts ON (users.user_id = posts.user_id) 
LEFT JOIN website.feeds feeds ON (posts.post_id = feeds.post_id) 
LEFT JOIN website.users likes ON (feeds.user_id = likes.user_id) 
LEFT JOIN website.friends friends ON ((posts.user_id = friends.user_id) OR (posts.user_id = friends.friends_id)) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC 

我基本上添加了一個加入朋友表與OR或在你似乎想加入的兩個領域...

+0

這個給我所有用戶的帖子......我想澄清一下:'friends.friend_id'是**朋友**的ID,'friends.user_id'是當前的ID用戶。因此,將輸出來自用戶的朋友和用戶的所有帖子。 –