Mysql -[Err]1111
阿新 • • 發佈:2018-12-10
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。