【问题标题】:How to write the following simple logic in full group by? [duplicate]如何在全组中编写以下简单逻辑? [复制]
【发布时间】:2020-09-24 13:18:35
【问题描述】:

首先,我不想使用语句

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

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

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

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

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

因此,我创建了以下 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 时的错误消息。

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

【问题讨论】:

    标签: mysql sql datetime subquery max


    【解决方案1】:

    我想在一条 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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多