Mysql -[Err] 1111 - Invalid use of group function

Mysql - [Err] 1111 - Invalid use of group function

描述:[Err] 1111 - Invalid use of group function意思是聚合函数的无效用法
报错SQL:

SELECT
	T2.code_id codeId,
	T1.user_id userId,
	T1.user_name CODE,
	SUM(T2.progress) AS progressSum
FROM
	T_USER_INFO T1
LEFT OUTER JOIN T_PLANNING T2 ON T2.code_id = T1.user_id
WHERE
	(
		T1.ENABLED = 1
		AND (SUM(T2.progress)) LIKE '%12%'
	)
GROUP BY
	T2.code_id,
	T1.user_id,
	T1.user_name

正确SQL:

SELECT
	T2.code_id codeId,
	T1.user_id userId,
	T1.user_name CODE,
	SUM(T2.progress) AS progressSum
FROM
	T_USER_INFO T1
LEFT OUTER JOIN T_PLANNING T2 ON T2.code_id = T1.user_id
WHERE
	(T1.ENABLED = 1)
GROUP BY
	T2.code_id,
	T1.user_id,
	T1.user_name
HAVING
	(SUM(T2.progress)) LIKE '%12%'

SQL还是比较好理解,主要是想实现聚合函数的过滤。我猜很多人第一想法是用WHERE,所以有了以上的报错。那为什么报错呢?
答:因为在where语句中使用了聚合函数。

这里主要要清楚where和having的作用以及区别:
**“WHERE”**是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”,因为where的执行顺序在聚合函数之前。

**“HAVING”**是一个过滤声明,过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,且having后面可以使用“聚合函数”。注意:having是对查出来的结果进行过滤,那么对没有查出来的值就不能使用having。

猜你喜欢

转载自blog.csdn.net/zcxbd/article/details/82784029
今日推荐