1. 程式人生 > >Mysql -[Err]1111

Mysql -[Err]1111

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。