mysql - 聊天应用好友列表

标签 mysql sql greatest-n-per-group

我有 3 个 MySQL 表,即 chat_comments、chat_friends 和 user_details,我想显示 friend 列表。

我的表:

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.comment , b.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
)

以上查询返回登录用户的 friend 在对话中发表的最后评论,而不是登录用户和他/她的 friend 之间的最后评论,无论是谁发表的。

我希望它能分别返回登录用户和他们的 friend 之间的最后评论,而不管评论是谁发表的。在 chat_messages 表中,user_id 是发送者,user_id2 是接收者。希望它有意义?

最佳答案

正如@imm 在评论中所说,您需要使用外连接。在左联接的情况下,user_details 表应该成为联接的左侧,右侧是 chat_comments 与您的 内部联接的结果一个 派生表。您还需要从 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 JOIN 替换为 RIGHT加入:

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
<b>RIGHT JOIN</b>
user_details u ON
 a.user_id = u.user_id
<b>WHERE u.user_id IN (select user_id2 from chat_friends where user_id=2020 AND approved=1)</b>

关于mysql - 聊天应用好友列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838491/

相关文章:

java - 将相同的 auto_increment id 插入到两个不同的表中

php - 使用 MySQL 和 PHP 进行唯一条目验证

mysql - 两个值desc之间的sql查询

sql - 滚动3天每日平均交易金额

sql - 如何更干净地将 sql 聚合函数与 distinct 结合起来?

mysql - split() 不适用于 mySQL join?

MySQL 插入值和一些要从其他表中选择的值

mysql - 如何在 MYSQL 中通过另一列选择具有 MAX(列值)、PARTITION 的行?

sql - 查询以获取具有最接近时间戳值的记录以获取两列的唯一组合

mysql - SQL获取给定小时内金额最高的记录