当我尝试在Sequel Pro中运行此查询时出现错误

时间:2019-09-27 23:47:56

标签: mysql sql join 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

不兼容

2 个答案:

答案 0 :(得分:1)

  

SELECT列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列'tawkifydb.dm.message',该列在功能上不依赖于GROUP BY子句中的列;这与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

答案 1 :(得分: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;