1

chat_comments、chat_friends、user_details という 3 つの MySQL テーブルがあり、フレンド リストを表示したいと考えています。

私のテーブル:

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 Mの助け):

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は受信者です。それが理にかなっていると思いますか?

4

1 に答える 1

1

@imm がコメントで述べたように、外部結合を使用する必要があります。左結合の場合、user_detailsテーブルは結合の左側になり、右側は派生テーブルchat_commentsとの内部結合の結果になります。また、副選択内から条件aを削除して、テーブルに再適用する必要があります。ここ:user_id IN (…)auser_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
)
;

または、右結合を使用することもできます。この場合、上記の LEFT JOIN ソリューションと同様に条件を移動し、2 番目を次user_id IN (…)のように置き換えるだけです。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)
于 2012-08-07T09:17:51.903 に答える