0

我正在尝试构建一个查询,该查询返回来自两个连接表的最新消息。但是我在 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 子句中,并且包含非聚合列 'tawkifydb.dm.message',它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

4

2 回答 2

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

于 2019-09-27T23:54:00.860 回答
0

你不需要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;
于 2019-09-28T00:11:56.897 回答