2014-07-01 208 views
0

每次運行一個php腳本時,我想刪除id的舊條目。然而MySQL拋出我這個錯誤:從MySQL刪除舊記錄的問題

#1111 - Invalid use of group function 

這是查詢:

DELETE FROM am_shoutbox WHERE MAX(msg_id)-160 > msg_id 

這裏有什麼問題嗎?我試着解決它,首先選擇最高的id,然後用第二個查詢刪除,但爲了獲得更好的性能,我想在一個可能的情況下執行此操作。

我希望有人能弄清楚上面的查詢有什麼問題。

回答

3

您不能在WHERE子句中使用聚合函數。你可以嘗試這樣的事情(使用子查詢在檢索MAX(msg_id)):

DELETE FROM am_shoutbox 
WHERE (SELECT * 
     FROM (SELECT MAX(msg_id) 
       FROM am_shoutbox) m) - 160 > msg_id 
+0

感謝您的快速響應。我嘗試了你的查詢,但我得到了另一個錯誤:#1093 - 你不能指定目標表'am_shoutbox'在FROM子句中更新 – Loki

+0

@Loki:是的,已更新。 – potashin

+0

這一個工程!謝謝 – Loki

0

被非法使用組函數的錯誤描述的是WHERE條款由於使用MAX(msg_id)。你可以用它無論是在選擇/子查詢或HAVING子句中:

delete from am_shoutbox 
    where 
    (select (max(ams.msg_id) FROM am_shoutbox ams) - 160) > msg_id 

*您可能需要指定在子查詢表別名如上

或更優雅和更好的性能方式:

delete from am_shoutbox 
    having (max(msg_id) - 160) > msg_id 
+1

帶HAVING的方法拋出這個錯誤:#1064 - 你的SQL語法錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在第1行的'having(max(msg_id) - 160)> msg_id'附近使用正確的語法。使用WHERE的其他方法會引發此錯誤:1064 - 你的SQL語法;檢查與您的MySQL服務器版本相對應的手冊,以便在'FROM am_shoutbox.msg_id'附近使用正確的語法) - 160)>第3行的msg_id' – Loki