MySQL中SELECT列不在GROUP BY子句中,并且包含非聚合列


<!–

–>

MySQL中SELECT列不在GROUP BY子句中,并且包含非聚合列

在使用MySQL进行查询时,我们可能会遇到以下错误提示:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这个错误提示表示查询语句中的SELECT列不在GROUP BY子句中,并且涉及到非聚合列,这在 5.7.5之后的版本中是不被允许的。让我们来看一个具体的例子:

假设我们有一个订单表order,其中包含订单编号(order_id)、订单金额(order_amount)和订单时间(order_time)三个字段。我们想按照订单时间分组,并计算每个分组的订单金额之和。

(adsbygoogle = window.adsbygoogle || []).push({});

以下是错误的查询语句:

SELECT order_time, order_amount 
FROM order
GROUP BY order_time;

这个查询语句将返回上述错误提示。

原因是我们在SELECT语句中选择了两个列,但是在GROUP BY语句中仅指定了一个列。换言之,我们将order_time作为GROUP BY子句的选择,但是同时也选择了非聚合列order_amount。这个问题可以通过将order_amount列聚合函数处理来解决。例如,我们可以使用SUM()函数计算每个分组的订单金额之和:

SELECT order_time, SUM(order_amount) 
FROM order
GROUP BY order_time;

上面的查询语句将按照订单时间分组,并计算每个分组的订单金额之和。

阅读更多:

总结

在MySQL中,当查询语句中SELECT列不在GROUP BY子句中,并且涉及到非聚合列时,会发生一个只允许在严格模式(sql_mode=only_full_group_by)下出现的错误。为了避免这个错误,我们需要在查询语句中使用聚合函数来处理非聚合列。

(adsbygoogle = window.adsbygoogle || []).push({});