首页 > 解决方案 > 如何在全组中编写以下简单逻辑?

问题描述

首先,我不想使用语句

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

关闭整个组,因为它默认启用,我相信这是出于良好的目的。然而,这也让我很头疼。

我在 MySQL 中有一个非常简单的 2 个数据库表:

聊天和聊天消息。 聊天有很多聊天消息。 聊天有一个名为 status 的列

现在我想在一个 SQL 语句中找到所有状态 ='active' 的聊天记录 id,按照它的聊天消息发送日期排序

因此,我创建了以下 SQL:

Select chat_messages.chat_id from chat_messages, chats where chats.status='active' and chat_messages.chat_id=chats.id group by chat_messages.chat_id order by chat_messages.send_date desc

好的,现在当我执行上述 SQL 时,我收到错误消息:

[Code: 1055, SQL State: 42000]  Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'chat_messages.send_date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

如果我将 send_date 放入 group by,结果只会返回多个重复的聊天记录,因为每个聊天表记录都有多个聊天消息记录,并且每个聊天消息记录都有不同的 send_date 值。

好的,现在的问题是:不关闭only_full_group_by,如何在一条sql语句中达到目的?

谢谢你。

** 更新 **

不知道为什么stackoverflow将问题标记为另一个不必要的帖子的重复。这显然与那个问题不同,因为这个问题试图解决打开 ONLY_FULL_GROUP_BY 时的错误消息。

该查询过去在引入完整分组之前非常简单,但现在它开始给出错误。我希望该网站知道没有一种适合所有人的方法,并停止在过去使用过时的解决方案来欺骗新问题,因为它无济于事,只会误导其他人。

标签: mysqlsqldatetimesubquerymax

解决方案


我想在一条 SQL 语句中查找所有状态为“活动”的聊天记录 ID,按其聊天消息发送日期排序

我了解到您想通过他们的最新消息订购聊天。如果是这样,您可以这样做:

select c.*
from chat c
where c.status = 'active'
order by (select max(cm.send_date) from chat_message cm where cm.chat_id = c.id)

如果您还想显示最后一条消息的日期,我们可以将相关子查询移至select子句:

select c.*, 
    (select max(cm.send_date) from chat_message cm where cm.chat_id = c.id) last_send_date
from chat c
where c.status = 'active'
order by last_send_date

如果您想要的只是聊天的 id(而不是其他聊天主数据),您甚至不需要查看聊天表:

select chat_id
from chat_message
group by chat_message
order by max(send_date) 

推荐阅读