2012-03-28 152 views
0

我使用的是MySQL 5.0.77数据库使用查询:如何使用子查询中删除/更新查询在MySQL

Delete from IPADDRESS 
where visitdate Not in (SELECT max(visitdate) FROM IPADDRESS WHERE USERNAME='MGSH0002') 
and USERNAME='MGSH0002' 

执行时,我收到此错误:

你可以从子句中指定目标表IPADDRESS用于更新

+0

为什么这是用java标签?移动到mysql – Jayan 2012-03-28 12:30:11

回答

3

当然不是最好的解决办法,但对于你的问题,这将这样的伎俩:

delete i1 from 
    IPADDRESS i1, 
    IPADDRESS i2 
where 
    i1.username = i2.username 
    and i1.username = 'MGSH0002' 
    and i1.visitdate < i2.visitdate 

的替代性和更聪明的解决方案是下面的语句:

delete i1 from 
    IPADDRESS i1, 
    (select max(visitdate) visitdate from IPADDRESS where username = 'MGSH0002') temp 
where 
    i1.username = 'MGSH0002' 
    and i1.visitdate < temp.visitdate 
+0

thnks这是工作我有一个更多的查询“删除从IPADDRESS where visitdate不在(SELECT visitdate FROM(SELECT visitdate FROM IPADDRESS WHERE USERNAME ='MGSH0002 'ORDER BY visitdate DESC)其中ROWNUM <4)和USERNAME ='MGSH0002'“它在oracle中工作,但不在mysql plz帮助 – manorma 2012-03-28 13:01:00

+1

第二种解决方案当然要聪明得多。它可能需要'group by username'成为'temp'子查询中的WHERE username ='MGSH0002'',但它比第一个好。并且如果有'(用户名,访问日期)的索引,则速度更快' – 2012-03-29 06:45:02

+0

Thx ypercube!我想编辑我的第二个解决方案,现在我们有了一个聪明的解决方案。 – GreenTurtle 2012-03-29 11:31:46