Error number: 3066; Symbol: ER_AGGREGATE_IN_ORDER_NOT_SELECT; SQLSTATE: HY000
Message: Expression #%u of ORDER BY clause is not in SELECT list, contains aggregate function; this is incompatible with %s
错误说明
ER_AGGREGATE_IN_ORDER_NOT_SELECT错误是MySQL返回的一种数据库错误,表明您在SELECT子句中使用了SQL聚合函数(例如SUM,AVG,MIN和MAX),但ORDER BY子句中没有包含它们。ORDER BY子句仅用于查询指定的行而不是聚合操作。
常见案例
ER_AGGREGATE_IN_ORDER_NOT_SELECT错误最常见的案例是,当您试图执行SELECT查询时,其ORDER BY子句中使用SQL聚合函数而不是表中的列时,可能会出现此错误。例如,如果您尝试使用以下查询执行查询,则可能会得到此错误
SELECT id,size, sum(price)
FROM orders
ORDER BY sum(price);
解决方法
要解决ER_AGGREGATE_IN_ORDER_NOT_SELECT错误,首先需要确保ORDER BY子句中不使用聚合函数。SQL不允许您使用聚合函数来对查询的结果进行排序,因为排序涉及每一行,而聚合函数只是对数据库中的所有行进行汇总。应该使用ORDER BY子句对表中的列进行排序,如例所示:
SELECT id,size, sum(price)
FROM orders
ORDER BY size;
请注意,如果要显示排序使用的聚合字段,可以使用HAVING子句,例如:
SELECT id, size, sum(price)
FROM orders
GROUP BY size
HAVING sum(price) > 10
ORDER BY size;
确保ORDER BY子句中不包含任何聚合函数以解决ER_AGGREGATE_IN_ORDER_NOT_SELECT错误,应该是解决此问题的最好方法。此外,可以使用HAVING子句来实现不使用聚合函数、但仍然显示聚合函数的效果。