Mysql 从数据库中选择数据并在分组后获得正确的顺序
我有以下sql查询:Mysql 从数据库中选择数据并在分组后获得正确的顺序,mysql,sql,join,group-by,greatest-n-per-group,Mysql,Sql,Join,Group By,Greatest N Per Group,我有以下sql查询: SELECT chat.*, user.vorname AS vorname, user.images AS userImage, nachrichten.ID as lastMessageID FROM `chat` LEFT JOIN `user` ON chat.userID = user.ID LEFT JOIN `nachrichten` ON chat.chatToken = nachrichten.chatToken WHERE chat.userID !
SELECT chat.*, user.vorname AS vorname, user.images AS userImage, nachrichten.ID as lastMessageID FROM `chat`
LEFT JOIN `user` ON chat.userID = user.ID
LEFT JOIN `nachrichten` ON chat.chatToken = nachrichten.chatToken
WHERE chat.userID != 1 AND chat.chatToken = chat.chatToken
ORDER BY nachrichten.ID DESC
输出:
现在我想按userID对结果进行分组:
SELECT chat.*, user.vorname AS vorname, user.images AS userImage, nachrichten.ID as lastMessageID FROM `chat`
LEFT JOIN `user` ON chat.userID = user.ID
LEFT JOIN `nachrichten` ON chat.chatToken = nachrichten.chatToken
WHERE chat.userID != 1 AND chat.chatToken = chat.chatToken
GROUP BY chat.userID
ORDER BY nachrichten.ID DESC
结果是:
但是我得到了最低的“lastMessageID”-我想得到最高的ID
丹尼斯->97(而不是90)
我的错在哪里?我知道您需要每个用户最新消息的
id
。如果是这样,我建议使用相关子查询而不是聚合:
select
c.*,
u.vorname,
u.images as userimage,
(select max(n.id) from `nachrichten` n where n.chatToken = c.chatToken) as lastmessageid
from `chat` c
inner join `user` u on u.id = c.userid
where c.userid != 1
此查询适用于任何版本的MySQL,包括5.7或更高版本,其中默认情况下只启用了的
(这将导致原始查询失败,因为SELECT
子句包含不属于GROUP BY
子句的非聚合列)
旁注:
- 表别名使查询更易于读取和写入
- 我从
子句中删除了不相关的条件where
;如果您的itent要消除chat.chatToken=chat.chatToken
为chat.chatToken
的行,只需使用null
c.chatToken不为null