Когда я работал над запросом несколько дней назад, мне нужно было почистить дубликаты записей в 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 шага:
-
SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1
Запрос повторяющихся записей в таблице в качестве условия -
SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1
Значение наименьшего идентификатора в повторяющихся записях в таблице запросов является вторым условием. -
Наконец, в соответствии с двумя вышеуказанными условиями, удалитеУдалитьОстальные повторяющиеся записи с наименьшим идентификатором среди повторяющихся записей
Но, к сожалению, при выполнении этого оператора произошла ошибка, что примерно означает, что таблица не может обновляться одновременно с запросом.
кодовое решение
Согласно приведенному выше оператору sql, можно достичь той же цели в два этапа с помощью кода:
-
Сначала удалите повторяющиеся наборы данных
-
В соответствии с запрошенным набором данных выполните цикл для удаления оставшихся повторяющихся данных.
Смысл в том, что он у меня есть, и он очень быстро пишет, но когда я его запускаю, я в шоке, и надо116sВлево и вправо, а затем я думаю, что должен найти оператор sql, который можно использовать, вставить код и текущий результат:
Идеальный [удалить один] 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 этапа для понимания:
-
(SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2
Запросите повторяющиеся записи, чтобы сформировать набор (временная таблица t2), набор представляет собой минимальный идентификатор каждой повторяющейся записи. -
consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_time
ассоциацияПоля для оценки повторяющихся тестов -
По условиям удаляем записи, id которых больше id в t2 в исходной таблице
Когда я увидел это предложение, я подумал про себя, что оно слишком мощное. Такая простая инструкция sql может решить такую сложную проблему, это потрясающе~
Кроме того, он очень быстро запускается.Исходный код выполняется в цикле, что требует116sвокруг и здесь0.3sВот так, отлично~
Суммировать
Как PHP-программист, я понимаю, что sql здесь нельзя сдерживать, но на самом деле слишком много вещей, которыми нужно заниматься, и текущий уровень sql находится только на обычном уровне, я должен восполнить это. в будущем знания. Поделитесь этим здесь сегодня.