2016-12-07 3 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 
     ) 
    ); 

В чем проблема? Я думаю, что нужно использовать подзапросы, но я не представляю, как использовать его в моем запросе.«Вы не можете указать целевую таблицу« t1 »для обновления в предложении FROM». Как удалить строки?

+0

нет 'update' ??? – Rahul

+0

неправильный синтаксис удаления: заменить 'delete t1 from' на' delete from' –

+0

Изменено с помощью 'delete from', но ошибка:' 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 't1 join pg_acymailing_subscriber tt на t1.subid = tt.subid join' в строке 1' – bars96

ответ

0

Я признаю, что сообщение об ошибке сложно выполнить. Это должно действительно сказать delete. Но проблема заключается в ссылке на pg_acymailing_listsub в подзапрос EXISTS, и это относится к числу таблиц, из которых вы хотите удалить.

MySQL не позволяет ссылаться в подзапросах на удаляемую таблицу. , , если вы не используете хакерство материализации.

Однако это должно быть легко исправить, добавив еще один пункт JOIN к FROM. Кажется, вы знаете, как это сделать.

+0

Я не знаю, где конкретно добавить предложение 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

Попробуйте заменить 'delete t1'' select count (*) ', он вернет мне 55695 строк вместо 7783. И это примерно у меня максимум 30000 строк, и он не может вернуть 55695 – bars96

Смежные вопросы

 Смежные вопросы