MySQL 查询以列出最近发过消息的用户

MySQL Query to list users who have recently messaged

我正在构建一个聊天应用程序,我想列出最近发过消息的用户,以及他们的 id, name, pic, and last message (id, timestamp, content)

我的两个表是这样的:

users:
------
id
name
pic

messages:
---------
id
content
timestamp
user_id (foreign key of user's id)

这是我试过的查询:

SELECT U.*, 
    MAX(M.id) as lastmessage_id 
FROM users U, messages M 
WHERE M.user_id=U.id 
GROUP BY user_id 
ORDER BY lastmessage_id DESC

它将列出最近发过消息的用户,但不包含最后一条消息的'content'

当前输出:

id, name, pic, lastmessage_id

要求输出:

id, name, pic, lastmessage_id, lastmessage_content, lastmessage_timestamp

试试这个...

select t1.id,t1.name,t1.pic,t1.lastmessage_id from (SELECT U.id,U.name,U.pic,(M.id) as lastmessage_id FROM users U, messages M WHERE M.user_id=U.id ORDER BY lastmessage_id DESC) t1
GROUP BY t1.id 

首先找到每个用户的所有最新消息id,然后将其与消息table连接起来得到相应的行:

select u.*,
    m.*
from users u
join messages m on u.id = m.user_id
join (
    select user_id,
        max(id) as id
    from messages
    group by user_id
    ) t on m.id = t.id
        and m.user_id = t.user_id
order by m.id desc;

此外,始终使用明确的现代连接语法而不是旧的基于逗号的语法。

在您的脚本中,您显示用户 table 中的所有列,但只显示消息 table 中的 ID。将您的脚本更改为以下一个。

SELECT U.*, 
    MAX(M.id) as lastmessage_id , M.content, M.timestamp
FROM users U, messages M 
WHERE M.user_id=U.id 
GROUP BY user_id 
ORDER BY lastmessage_id DESC

尝试使用 JOIN:

SELECT U.*, MAX(M.id) AS lastmessage_id 
FROM users U

JOIN MESSAGES M ON U.id = M.user_id

GROUP BY user_id 
ORDER BY lastmessage_id DESC
SELECT *
FROM users U, messages M
WHERE M.user_id=U.id
 and M.id=(select max(M2.id)
    from messages M2
    where M2.user_id = U.id)