当列在select中存在但在group中不存在时,该如何工作?



这一列DATE_FORMAT(日期,"%b")在select子句中有但在group by子句中没有的月份。相反,它有一个不同的列,但仍然有效。这是如何工作的呢?

我的理解是在select子句中存在的列必须在group by子句中存在。

SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total
FROM cart
WHERE date <= NOW() and date >= Date_add(Now(),interval - 12 month)
GROUP BY DATE_FORMAT(date, "%m-%Y"

您的查询在标准SQL中不允许。最近版本的MySQL也不允许使用默认设置。如果您使用的是旧版本,可以通过设置only_full_group_by来拒绝查询。

具体的错误实际上很清楚:

SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列'db_1133225228.cart。date',它在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by

不兼容。

一般情况下,未聚合的SELECT表达式需要在GROUP BY中。(一个例外基本上是当GROUP BY包含一个主键;)

在旧版本的MySQL或only_full_group_by设置不正确时会发生什么?在这种情况下,将从组中选择一个任意值作为值。这个值可以在查询的不同运行中改变(尽管在实践中这个值是相当稳定的)。

然而,我的建议是使用only_full_group_by来编写与标准和几乎所有其他数据库在这方面一致的查询。