从数据库中选择数据并在分组后获得正确的顺序

Posted

技术标签:

【中文标题】从数据库中选择数据并在分组后获得正确的顺序【英文标题】:select data from database and get right order after grouping 【发布时间】:2020-09-08 13:32:13 【问题描述】:

我有以下 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)

我的错在哪里?

【问题讨论】:

请阅读meta.***.com/questions/333952/…并添加数据的来源 尝试:SELECT ....., MAX(lastMessageID) ........ @BerndBuffen:就是这样!谢谢:) 请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 【参考方案1】:

我了解您希望每个用户获得最新消息的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 子句)。

旁注:

表别名使查询更易读写

我从where 子句中删除了不相关的条件chat.chatToken = chat.chatToken;如果您的目的是消除chat.chatTokennull 的行,只需使用c.chatToken is not null

【讨论】:

以上是关于从数据库中选择数据并在分组后获得正确的顺序的主要内容,如果未能解决你的问题,请参考以下文章

Django - 分组数据并在模板中显示选择的名称

猪 - 获得前 n 名并在“其他”中分组休息

Pandas groupby 类别,评级,从每个类别中获得最高价值?

谷歌电子表格:脚本从 html 导入的数据中选择正确的值,并且从不以正确的顺序

UITableview 的名称部分按排序顺序排列

为顺序数据选择正确的类似 DBM 的 C++ 库