mysql - 如何在全组中编写以下简单逻辑?
问题描述
首先,我不想使用语句
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 时的错误消息。
该查询过去在引入完整分组之前非常简单,但现在它开始给出错误。我希望该网站知道没有一种适合所有人的方法,并停止在过去使用过时的解决方案来欺骗新问题,因为它无济于事,只会误导其他人。
解决方案
我想在一条 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)
推荐阅读
- javascript - Vue 3 - 延迟加载图像组件
- mysql - 幽灵/复制表比原始表大很多倍
- c++ - 对深度的时间去除会产生鬼影
- python - 一旦到达结束python如何反转迭代
- javascript - 用 JavaScript 和 P5 创建游戏 - 几个基本问题
- arrays - C 多维数组镜像自身
- axapta - Dynamics 365(财务和运营):使用纯 JavaScript 应用程序中的 ODATA 服务端点 URL 时出现 CORS 问题
- reactjs - 私有路由的嵌套路由反应路由器dom
- docker - 如何在远程服务器上运行 docker load
- python - pyspark中列中的集群值变化