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)
我正在构建一个聊天应用程序,我想列出最近发过消息的用户,以及他们的 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)