MySQL [Удалить и оставить один] Выполнено одно выражение sql Резюме идей

задняя часть MySQL Байду SQL

Когда я работал над запросом несколько дней назад, мне нужно было почистить дубликаты записей в mysql.Идея на тот момент была в том, чтобы написать это через обход кода, а потом я подумал, что это слишком сложно.Я думал, что проблема должно быть решено оператором sql. Проверив информацию и посоветовавшись с большими ребятами, я придумал очень удобный оператор sql.Здесь я делюсь этим оператором sql и идеями.

анализ спроса

В базе данных есть повторяющиеся записи, удалите и сохраните одну из них (основание для определения наличия дубликатов по нескольким полям)

решение

Когда я сталкиваюсь с этой потребностью, у меня, вероятно, есть идея в моем сердце. Самая быстрая мысль состоит в том, что это можно решить с помощью оператора sql, но я слишком поверхностен в отношении сложных операторов sql, поэтому я хочу попросить помощи у большого парня.

получить помощь

Поскольку этот спрос немного беспокоит, первая мысль состоит в том, что я могу найти коллегу в этой области, чтобы решить его, а затем поделиться этой проблемой с@赵七七Одноклассники, в итоге я просто плюнул на этот продукт, и дали мне оператор SQL, которым я никогда раньше не пользовался, и дали попробовать самому.

Байду

Нашел оператор sql:

DELETE
FROM
    vitae a
WHERE
    (a.peopleId, a.seq) IN (
        SELECT
            peopleId,
            seq
        FROM
            vitae
        GROUP BY
            peopleId,
            seq
        HAVING
            count(*) > 1
    )
AND rowid NOT IN (
    SELECT
        min(rowid)
    FROM
        vitae
    GROUP BY
        peopleId,
        seq
    HAVING
        count(*) > 1
)

Это заявление находится в[Удалить повторяющиеся данные в MySQL и оставить только один элемент]нашел в этой статье. Эта идея sql очень очевидна, есть следующие 3 шага:

  1. SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1Запрос повторяющихся записей в таблице в качестве условия

  2. SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1Значение наименьшего идентификатора в повторяющихся записях в таблице запросов является вторым условием.

  3. Наконец, в соответствии с двумя вышеуказанными условиями, удалитеУдалитьОстальные повторяющиеся записи с наименьшим идентификатором среди повторяющихся записей

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

кодовое решение

Согласно приведенному выше оператору sql, можно достичь той же цели в два этапа с помощью кода:

  1. Сначала удалите повторяющиеся наборы данных

  2. В соответствии с запрошенным набором данных выполните цикл для удаления оставшихся повторяющихся данных.

Смысл в том, что он у меня есть, и он очень быстро пишет, но когда я его запускаю, я в шоке, и надо116sВлево и вправо, а затем я думаю, что должен найти оператор sql, который можно использовать, вставить код и текущий результат:

code.png

code.png

run_code_result.png

run_code_result.png

Идеальный [удалить один] SQL

Наконец получил идеальный ответ в технической группе, посмотрите на этот оператор sql:

DELETE consum_record
FROM
    consum_record, 
    (
        SELECT
            min(id) id,
            user_id,
            monetary,
            consume_time
        FROM
            consum_record
        GROUP BY
            user_id,
            monetary,
            consume_time
        HAVING
            count(*) > 1
    ) t2
WHERE
    consum_record.user_id = t2.user_id 
    and consum_record.monetary = t2.monetary
    and consum_record.consume_time  = t2.consume_time
AND consum_record.id > t2.id;

В приведенном выше SQL-операторе, если внимательно присмотреться, понять идею несложно. Вероятно, он разделен на 3 этапа для понимания:

  1. (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2Запросите повторяющиеся записи, чтобы сформировать набор (временная таблица t2), набор представляет собой минимальный идентификатор каждой повторяющейся записи.

  2. consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_time ассоциацияПоля для оценки повторяющихся тестов

  3. По условиям удаляем записи, id которых больше id в t2 в исходной таблице

Когда я увидел это предложение, я подумал про себя, что оно слишком мощное. Такая простая инструкция sql может решить такую ​​сложную проблему, это потрясающе~
Кроме того, он очень быстро запускается.Исходный код выполняется в цикле, что требует116sвокруг и здесь0.3sВот так, отлично~

perfect_sql.png

perfect_sql.png

Суммировать

Как PHP-программист, я понимаю, что sql здесь нельзя сдерживать, но на самом деле слишком много вещей, которыми нужно заниматься, и текущий уровень sql находится только на обычном уровне, я должен восполнить это. в будущем знания. Поделитесь этим здесь сегодня.