MySql Delete - то же самое, что select (join) - PullRequest
3 голосов
/ 09 мая 2011

Я скопировал некоторые записи из одной таблицы в другую с этим запросом:

insert into pages_finished (keyword,pages,resultlist,done,current)
select keyword,pages,resultlist,done,current 
 from pages_done o  
 where  (select count(*) as totalPages from pages_done x  where x.keyword = o.keyword)-1 = pages 

Теперь я хочу удалить те же записи из исходной таблицы, Я думал, что это будет просто, как:

delete from pages_done o  
 where  (select count(*) as totalPages from pages_done x  where x.keyword = o.keyword)-1 = pages 

но это не работает. Кто-нибудь может сказать мне, как правильно это сделать?

После ответа @bgdrl я думаю о запуске только выбора, получить идентификаторы всех записей, которые должны быть скопированы, а затем удалить; но я думаю, что должно быть более простое решение, кто-нибудь?

Даже если пометить ответ @bgdrl как правильный ответ, это только из-за этого факта.

Всем, кто интересуется тем, что я в итоге делал: Я сделал тот же выбор, с которого начал (но выбрал только столбец идентификатора, так как выбор всех столбцов убил бы мой плохой компьютер), экспортировал его в INSERT STATMENTS (используя mysqlworkbench), открыл текстовый файл в блокноте, заменил все INSERT INTO ... на DELETE FROM WHERE ID=, и запустите этот запрос в mysql.

Я чувствую себя настолько глупо, когда использую этот способ, но, очевидно, у меня не было другого выбора.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

С сайта mysql: «Вы не можете изменить таблицу и выбрать одну и ту же таблицу в подзапросе. Это относится к таким операторам, как DELETE, INSERT, REPLACE, UPDATE». http://dev.mysql.com/doc/refman/5.1/en/subqueries.html

0 голосов
/ 10 мая 2011

ПОЖАЛУЙСТА, СОЗДАЙТЕ РЕЗЕРВНЫЙ СТОЛ, ПЕРЕД СЛЕДУЮЩИМ ШАГАМ.

Выполните следующие ШАГИ

ШАГ 1

CREATE TABLE pages_done_ids 
    SELECT o.id FROM pages_done AS o  
    WHERE 
    (
        SELECT count(*) AS totalPages 
        FROM pages_done AS x  
        WHERE x.keyword = o.keyword
    )-1 = o.pages

ШАГ 2

DELETE FROM pages_done AS o  
WHERE o.id IN (SELECT id FROM pages_done_ids)

ШАГ 3

DROP TABLE pages_done_ids;

ОК, вы можете выполнить это с помощью одной транзакции, используя ВРЕМЕННЫЕ ТАБЛИЦЫ.

Счастливых запросов!

...