2012-12-28 54 views
2

我試圖發現表中所有行出現多次的外鍵,並通過子查詢返回這些外鍵。MySQL,通過特定外鍵出現的次數進行篩選

的專欄中,我能夠想象每個外鍵的COUNT使用GROUP BY

SELECT orders_id, COUNT(*) as count 
FROM order_history 
GROUP BY orders_id 

但後來當我有一個增加它放在企圖子句來過濾,比如:

SELECT orders_id, COUNT(*) as count 
FROM order_history 
GROUP BY orders_id 
WHERE count > 1 

我得到一個錯誤

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE count > 1 LIMIT 0, 30' at line 4 

顯然count沒有資格在點WHERE比較評估?

:帖子答案更新:

感謝您的迅速回應! HAVING正是我所錯過的。我發現此問題有助於展開以下主題:WHERE vs HAVING

+1

的錯誤是常見的 - *的部件事項SQL SELECT語句的順序*。正如在這種情況下,'WHERE'(如果存在)必須始終在'GROUP BY'之前;這裏的根本問題是*無效的語法*而不是一個未綁定的標識符。 (選擇可以嵌套,但有更好的方法來處理這個。) – 2012-12-28 21:04:29

回答

3

要對類似於COUNT(),SUM(),MAX(),MIN()的聚合值應用過濾,請使用HAVING子句而不是WHERE

SELECT orders_id, COUNT(*) as count 
FROM order_history 
GROUP BY orders_id 
HAVING count > 1 

從事實的語法錯誤結果,一個WHERE條款必須先於GROUP BY條款。但是,即使它位於正確的位置,它仍然會出錯,因爲在計算WHERE子句時,count別名將是未知的。

MySQL SELECT syntax documentation

HAVING子句可以指任何列或在SELECT列表或外子查詢一個select_expr命名別名,並聚集函數。

+0

感謝您完成。 –

1

不能使用where clausegroup by clause,在這種情況下,你必須使用having

SELECT orders_id, COUNT(*) as count 
FROM order_history 
GROUP BY orders_id 
having count > 1