2013-12-13 97 views
0

我正在製作一個模擬Twitter網站,對於主要Feed,我試圖查詢我的數據庫中的所有帖子,並從某人跟隨的用戶轉貼,其中$ user_id是當前的人登錄。但它只是顯示轉發的帖子,當我運行查詢。任何人都可以請給我建議如何解決這個問題?在mysql查詢中多次連接

$query_feed = "SELECT posts.post, posts.date, users.handle, posts.id, posts.image,  users.profile_pic, repost.post_id, repost.user_id 
       FROM posts 
       JOIN users ON posts.author_id = users.id 
       JOIN following ON " . $user_id . " = following.follower_id 
       JOIN repost ON posts.id = repost.post_id 
       WHERE (posts.author_id = following.followee_id) OR (repost.user_id = following.followee_id) 
       ORDER BY posts.id desc"; 

回答

0

那是因爲你有一個「內部連接」上轉貼(「加入」真的是短期的「內部連接」):

JOIN repost ON posts.id = repost.post_id

這樣做意味着你將永遠只得到你的結果的記錄,如果有在repost

匹配的記錄,而是嘗試一種「外部聯接」或「左連接」

設定

這應該意味着你的記錄,即使沒有什麼repost

我已經簡化你的表一點(去除列),但證明了SqlFiddle穴位置:http://www.sqlfiddle.com/#!2/ee33a

+0

我試過了外部連接,它給了我一個SQL查詢語法錯誤。和左連接完全不影響我的查詢輸出。 – user3029077

+0

我已經更新了答案,並鏈接到一個證明SQL工作的SqlFiddle:http://www.sqlfiddle.com/#!2/ee33a –

0

如果您不希望repost表消除結果集中的記錄,您需要使用外部聯接。

此外,您join條件爲following表是where子句中,和where條款包含您join條件。另外,由於followingjoin條件引用repost中的字段,因此連接順序不正確。

$query_feed = "SELECT posts.post, posts.date, users.handle, posts.id, posts.image,  users.profile_pic, repost.post_id, repost.user_id 
       FROM posts 
       JOIN users ON posts.author_id = users.id 
       LEFT JOIN repost ON posts.id = repost.post_id 
       JOIN following ON (posts.author_id = following.followee_id) OR (repost.user_id = following.followee_id) 
       WHERE " . $user_id . " = following.follower_id 
       ORDER BY posts.id desc"; 

我不知道MySQL的是如何處理的事情完全是,但你可能仍然有來自LEFT JOINNULL小號問題,當你做following表連接。我會在查詢分析器中運行查詢來確定您是否獲得了預期的結果。