【问题标题】:Getting an error when I try to run this query in sequel pro [duplicate]当我尝试在 sequel pro 中运行此查询时出现错误 [重复]
【发布时间】:2020-01-28 05:41:32
【问题描述】:

我正在尝试构建一个查询,该查询返回来自两个连接表的最新消息。但是我在 group by 上遇到错误。也许我完全错误地接近它。

我知道在我当前的实现中我会得到一个列表,而不是最新的,但我至少想在开头看到最新的

SELECT m.message, m.created_at
FROM conversations c
JOIN messages m ON c.id = m.conversation_id
WHERE m.conversation_id = 5
GROUP BY m.created_at DESC;

这是错误: SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“tawkifydb.dm.message”;这与 sql_mode=only_full_group_by 不兼容

【问题讨论】:

标签: mysql sql join group-by


【解决方案1】:

SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“tawkifydb.dm.message”;这与 sql_mode=only_full_group_by 不兼容

SELECT 中的每一列都应该在 GROUP BY 中(或使用聚合)。该错误告诉 SELECT 中的 m.message,而不是 GROUP by(并且它不是聚合)中的 m.message

你需要这样的东西:

GROUP BY m.created_at, m.message
ORDER BY m.created_at DESC;

更新:我认为 DESC 也不应该在 GROUP BY 中,所以添加了一个 ORDER BY

【讨论】:

  • 完美!当它允许我时我会接受
  • mysql 8/ Workbench 在这个位置不喜欢 DESC
  • @nbk 认为你是对的,所以更新了帖子
【解决方案2】:

您不需要join 表格。 conversations 表根本不需要:

SELECT m.message, m.created_at
FROM messages m
WHERE m.conversation_id = 5 AND
      m.created_at = (SELECT MAX(m2.created_at)
                      FROM messages m2
                      WHERE m2.conversation_id = m.conversation_id
                     );

或者,在这种情况下,因为你只想要一个对话一行,最简单的方法是:

SELECT m.message, m.created_at
FROM messages m
WHERE m.conversation_id = 5 
ORDER BY m.created_at DESC
LIMIT 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2019-01-26
    • 2021-12-24
    • 2021-10-25
    • 2020-10-09
    • 2020-10-29
    • 2022-01-15
    相关资源
    最近更新 更多