MySQL удаляет строки с подзапросом

Я хочу удалить повторяющиеся строки из моей таблицы ссылок. Этот запрос выбора здесь работает:

SELECT *
from LINKS t1
WHERE EXISTS (
    SELECT *
    from LINKS t2
    where t2.cntid = t1.cntid
        and t2.title= t1.title
        and t2.lnkid > t1.lnkid
);

когда я изменяю тот же запрос на удаление:

    DELETE from LINKS t1
WHERE EXISTS (
    SELECT *
    from LINKS t2
    where t2.cntid = t1.cntid
        and t2.title= t1.title
        and t2.lnkid > t1.lnkid
);

он больше не работает и сообщает: ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL

В чем проблема? Может кто-нибудь помочь исправить запрос?


person sub    schedule 21.11.2013    source источник
comment
Потому что DELETE и SELECT имеют разный синтаксис, не так ли?..   -  person Alma Do    schedule 21.11.2013


Ответы (2)


вы можете сделать это только с помощью JOIN без EXISTS и встроенного представления следующим образом:

DELETE t1
FROM LINKS t1, LINKS t2
WHERE t2.cntid = t1.cntid
    AND t2.title= t1.title
    AND t2.lnkid > t1.lnkid

Это быстрее, чем использование EXISTS. конечно, вы SELECT можете быть преобразованы таким образом.

SELECT *
from LINKS t1, LINKS t2
WHERE t2.cntid = t1.cntid
    AND t2.title= t1.title
    AND t2.lnkid > t1.lnkid

Если попробуете УДАЛИТЬ, плз set autocommit = '0'

person Jason Heo    schedule 21.11.2013
comment
Спасибо, запрос на удаление теперь работает. Однако, поскольку существует пара миллионов повторяющихся строк, запрос на удаление выполняется уже более часа, и конца ему не видно. Можно ли как-то ускорить процесс? - person sub; 21.11.2013
comment
@sub трудно печатать. Я использую смартфон, кроме того, мой английский не очень хорош. Можете ли вы попробовать мой ответ на другой вопрос? Я действительно хочу знать, что этот ответ улучшит вас. Пожалуйста, дайте мне знать. stackoverflow.com/questions/ 19929000/ - person Jason Heo; 21.11.2013

Пытаться:

DELETE t1 from LINKS t1 
   WHERE EXISTS (SELECT * from (select * from LINKS) t2 
                   where t2.cntid = t1.cntid 
                   and t2.title= t1.title 
                   and t2.lnkid > t1.lnkid);

демонстрация SQLFiddle

person valex    schedule 21.11.2013