2012-08-07 23 views
1

我有3個MySQL表,即chat_comments,chat_friends和user_details,我想顯示一個朋友列表。聊天應用程序的朋友列表

我的表:

chat_comments(comment_id,comment,user_id,user_id2,date_added) 
chat_friends(user_id,user_id2,approved) 
user_details(user_id, mainimage_id, fullname) 

要做到這一點,我需要一個查詢將返回所需的字段(u.mainimage_idu.fullnameb.commentb.user_id),所以我可以遍歷列表中顯示的表。

SQL至今(從@Andriy中號幫助):

SELECT 
cc.comment, 
cc.date_added, 
u.fullname, 
u.mainimage_id 
FROM 
user_details u 
LEFT JOIN 
    chat_comments cc 
    INNER JOIN (
     SELECT 
      user_id, 
      MAX(comment_id) AS maxcomment 
     FROM chat_comments WHERE user_id=2020 OR user_id2=2020 
     GROUP BY user_id 
    ) a ON a.user_id = cc.user_id 
     AND a.maxcomment = cc.comment_id 
ON a.user_id = u.user_id 
WHERE u.user_id IN (
SELECT user_id2 
FROM chat_friends 
WHERE user_id = 2020 
    AND approved = 1 
) 

上述查詢返回上次登錄的用戶之間的談話登錄用戶的朋友不是最後的評論提出的意見他/她的朋友,不管是誰做的。

我希望它能夠單獨返回登錄用戶和他們的朋友之間的最後一條評論,而不管是誰做的。在chat_messages表中,user_id是發送方,而user_id2是接收方。希望它是有道理的?

+0

您是否嘗試過使用LEFT JOIN可言,而不是INNER? – imm 2012-08-07 05:03:53

+0

我很抱歉,但似乎還有一個不確定性(或者,也許由於您的編輯而出現)。當你在你的評論中提到它時,我已經理解了你,所以你想要*朋友*的最後一條消息*到登錄的用戶。現在從編輯後的問題中可以看出,你想要在相應的對話*中留下最後的消息*,即不管它是由用戶還是由朋友。那實際上是哪個? (在你的問題中,重複了'*'這個短語,'不管是誰做出來的',這會改變我的意思。你可能錯誤地複製粘貼了它嗎?) – 2012-08-08 05:03:36

回答

1

像@imm在評論中說的,你需要使用一個外連接。在左連接的情況下,user_details表應該成爲連接的左側,右側是內連接chat_commentsa派生表的結果。您還需要從a子選擇中刪除user_id IN (…)條件,並將其重新應用到user_details表。這裏:

SELECT 
    cc.comment, 
    cc.date_added, 
    u.fullname, 
    u.mainimage_id 
FROM 
    user_details u 
    LEFT JOIN 
     chat_comments cc 
     INNER JOIN (
      SELECT 
       user_id, 
       MAX(comment_id) AS maxcomment 
      FROM chat_comments 
      GROUP BY user_id 
     ) a ON a.user_id = cc.user_id 
      AND a.maxcomment = cc.comment_id 
    ON a.user_id = u.user_id 
WHERE u.user_id IN (
    SELECT user_id2 
    FROM chat_friends 
    WHERE user_id = 2020 
     AND approved = 1 
) 
; 

或者,您可以使用正確的連接。在這種情況下,你只需要移動user_id IN (…)條件,類似於LEFT JOIN以上的解決方案,並更換第二INNER JOINRIGHT JOIN

SELECT 
    cc.comment, cc.date_added, u.fullname, u.mainimage_id 
FROM 
    (
     SELECT user_id, MAX(comment_id) AS maxcomment 
     FROM chat_comments 
     GROUP BY user_id 
    ) a 
INNER JOIN 
    chat_comments cc ON 
     a.user_id = cc.user_id AND 
     a.maxcomment = cc.comment_id 
RIGHT JOIN 
user_details u ON 
a.user_id = u.user_id 
WHERE u.user_id IN (select user_id2 from chat_friends where user_id=2020 AND approved=1) 
+0

對兩個sql查詢都進行了測試,它們返回所有用戶在user_details表中,不管我們是否是朋友。 – user1502826 2012-08-07 11:37:52

+0

@ user1502826:我明白我錯過了什麼。請看看最新的答案。 – 2012-08-07 11:49:49

+0

兩個人都像魅力一樣工作,返回相同的結果,平均而言,第二個稍快。優秀。由於 – user1502826 2012-08-07 12:29:58

相關問題