2016-12-07 29 views
0
delete t1 from pg_acymailing_listsub t1 
     join pg_acymailing_subscriber tt on t1.subid = tt.subid 
     join pg_users t2 on tt.userid = t2.id 
    where NOW() > t2.registerDate + interval 90 day and t1.listid=7 and (
     exists (
      SELECT * FROM pg_acymailing_listsub WHERE pg_acymailing_listsub.listid=1 AND pg_acymailing_listsub.subid = t1.subid AND pg_acymailing_listsub.status=-1 LIMIT 1 
     ) OR t1.subid not in (
      select pg_acymailing_userstats.subid from pg_acymailing_userstats where pg_acymailing_userstats.subid = t1.subid and pg_acymailing_userstats.open > 0 
     ) 
    ); 

什么问题?我认为需要使用子查询,但我不知道如何在查询中使用它。“您无法在FROM子句中指定目标表't1'进行更新”。如何删除行?

+0

没有'update' ??? – Rahul

+0

错误的删除语法:用'delete from'替换'delete t1 from' –

+0

用'delete from'修改,但错误:'1064 - 您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的正确语法手册“T1连接上t1.subid = tt.subid pg_acymailing_subscriber TT加入”在行1' – bars96

回答

0

我承认错误信息很难遵循。它应该真的说delete。但是问题在于EXISTS子查询中pg_acymailing_listsub的引用,这是您要从中删除的表格之一。

MySQL不允许在子查询中引用正在从中删除的表。 。 。除非你使用实体黑客。

但是,通过向FROM添加另一个JOIN子句可以很容易地解决这个问题。你似乎知道该怎么做。

+0

我不知道在哪里specificaly添加'JOIN'条款你建议 – bars96

0

试试这个:

delete t1 from pg_acymailing_listsub t1 
     join pg_acymailing_subscriber tt on t1.subid = tt.subid 
     join pg_users t2 on tt.userid = t2.id 
     join pg_acymailing_listsub t3 on t3subid=t1.subid and t3.listid=1 and t3.[status]=-1 
     join pg_acymailing_userstats t4 on t4.subid = t1.subid AND t4.[open]<=0 
where NOW() > t2.registerDate + interval 90 day and t1.listid=7 
+0

试图取代'和'SELECT COUNT(*)'删除t1',它返回我,而不是7783. 55695行,这是关于我有最大的30000行,它不能返回55695 – bars96

相关问题