Несколько дней назад, когда я выполнял требование, мне нужно было убрать дублирующиеся записи в mysql, и тогда идея заключалась в том, чтобы написать это через перемещение кода, но потом я подумал, что это слишком сложно, думая, что смогу решить проблему с помощью SQL-оператора. Проверив информацию и проконсультировавшись с начальником, я придумал очень удобное SQL-сообщение, и здесь я поделюсь этим sql-заявлением и идеями.
Анализ потребностей
Если в базе данных есть дублирующие записи, удалите и оставьте одну из них (независимо от того, являются ли критерии определения дублирующих полей несколькими полями)
решение
Когда вы сталкиваетесь с этой потребностью, у вас, вероятно, есть идея в сердце. Самое быстрое, что я придумал — это решение с помощью SQL-оператора, но я был слишком поверхностен в сложных SQL-операторах, поэтому хотел попросить помощи у начальника.
Найдите кого-то, кто поможет
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Own Baidu
Нашёл SQL-оператор:
Идея 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-утверждения, я думаю, что вы можете достичь той же цели за два шага с помощью кода:
- Сначала удаляются дублирующиеся наборы данных
- На основе запрошенного набора данных оставшиеся дубликаты удаляются по циклу
У меня была идея, я быстро её написал, но был шокирован, когда её опубликовал, а она мне действительно была нужна116-еслева и справа, а затем я хочу найти SQL-оператор, который можно использовать, вставить код и запуск результата:
Идеальный [дедупликация и оставление одного] SQL
Наконец, я получил идеальный ответ в технической группе, посмотрите на это утверждение в SQL:
Приведённое выше SQL-утверждение, если присмотреться, понять идею несложно, и, вероятно, оно делится на 3 этапа для понимания:
- (SELECT min(id) id, user_id, monetary, consume_time ИЗ consum_record ГРУППЫ ПО user_id, монетарному consume_time HAVING count(*) > 1 ) t2 Запросить дублирующиеся записи для формирования коллекции (временной таблицы t2), содержащей минимальный идентификатор каждой дублирующей записи
- consum_record.user_id = t2.user_id и consum_record.monetary = t2.monetary и consum_record.consume_time = t2.consume_time Ассоциированные поля для дублирующих критериев
- Удалять записи с ID выше ID в T2 в соответствии с условиями
Когда я увидел это предложение, подумал, что оно слишком сильное. Такое простое sql-утверждение может решить такую сложную задачу, и позиция расти~ Он также очень быстрый в запуске, оригинальный цикл кода занимает около 116 секунд, но здесь 0,3 секунды достаточно, потрясающе~
|