select 数据库中的数据,分组后得到正确的顺序
select data from database and get right order after grouping
我有以下 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 != 1 AND chat.chatToken = chat.chatToken
ORDER BY nachrichten.ID DESC
输出:
现在我想按用户 ID 对结果进行分组:
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 或更高版本,其中 ONLY_FULL_GROUP_BY
默认启用(这将导致您的原始查询失败,因为 SELECT
子句包含不属于 GROUP BY
子句的非聚合列。
旁注:
table 别名使查询更易于读写
我从 where
子句中删除了不相关的条件 chat.chatToken = chat.chatToken
;如果您的目的是消除 chat.chatToken
为 null
的行,只需使用 c.chatToken is not null
我有以下 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 != 1 AND chat.chatToken = chat.chatToken
ORDER BY nachrichten.ID DESC
输出:
现在我想按用户 ID 对结果进行分组:
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 或更高版本,其中 ONLY_FULL_GROUP_BY
默认启用(这将导致您的原始查询失败,因为 SELECT
子句包含不属于 GROUP BY
子句的非聚合列。
旁注:
table 别名使查询更易于读写
我从
where
子句中删除了不相关的条件chat.chatToken = chat.chatToken
;如果您的目的是消除chat.chatToken
为null
的行,只需使用c.chatToken is not null