2014-07-01 36 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