MySQL DELETE запрос с условиями - PullRequest
1 голос
/ 27 июня 2011

У меня есть таблица PEOPLE со столбцами firstName, lastName (varchars) и удаленные (бит), среди прочих.

Я хочу удалить из этой таблицы записи, имеющие свойство TRUEдля удаленных, но только если они совместно используют свои точные имена firstName и lastName с другой отдельной записью в таблице.

Другими словами, удаляйте из таблицы «удаленных» людей, но только если они являются дубликатами.

Не уверен, как это сделать, и особенно не как это сделать быстро.Любая помощь приветствуется, спасибо.

Ответы [ 3 ]

1 голос
/ 27 июня 2011
DELETE FROM people
WHERE EXISTS (
    SELECT *
    FROM people p2
    WHERE people.firstName = p2.firstName AND people.lastName = p2.lastName
    GROUP BY firstName, lastName
    HAVING COUNT(*)>1
)
AND deleted = 1 -- True
1 голос
/ 28 июня 2011

Если ваша таблица имеет уникальный первичный ключ (... будет зависеть от дизайна ...), то это жизнеспособная альтернатива необходимости подсчета вхождений записей:

DELETE FROM people as A
WHERE deleted = 1
AND EXISTS (SELECT '1'
            FROM people as B
            WHERE B.id <> A.id
            AND A.firstName = B.firstName
            AND A.lastName = B.lastName)

Это может иметь чуть лучшую производительность, чем подсчет строк. Обратите внимание, что этот запрос, скорее всего, столкнется с той же возможной проблемой, что и в предыдущем ответе; в частности, если есть две или более «удаленных» строк, а «не удаленных» нет, обе они, вероятно, будут удалены (оставив вас без строк!). Если целью запроса является удаление только «удаленных» строк при наличии «не удаленной» эквивалентной строки, добавьте AND B.deleted = 0 как часть внутреннего предложения WHERE.

0 голосов
/ 27 июня 2011

Вот простой способ сделать это:

http://www.justin -cook.com / шр / 2006/12/12 / удалить-дублированные записи-строка-а-MySQL-базы данных таблица /

В основном:
1. Создайте новую таблицу с GROUP BY.
2. Удалить старую таблицу.
3. Переименуйте новую таблицу.

...