Кілька днів тому, коли я виконував вимогу, мені потрібно було очистити дублікати записів у 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 Друга умова — найменше значення ID у дублікатних записах у таблиці запитів
- Нарешті, відповідно до двох вищезазначених умов, видалити залишкові дублікати записів, окрім найменшого ID у дубльованому записі
Але, на жаль, при запуску цього оператора виникає помилка, що приблизно означає, що таблицю не можна оновити одночасно з запитом.
Код розв'язано
Виходячи з наведеного вище SQL-твердження, я думаю, що ви можете досягти цієї мети за два кроки через код:
- Спочатку видаляються дублікати наборів даних
- На основі запитаного набору даних решта дублікатів видаляються у циклі
У мене з'явилася ідея, і я швидко її написав, але був шокований, коли опублікував її, а вона мені справді була потрібна116ліворуч і праворуч, а потім я хочу знайти SQL-оператор, який можна використати, вставити код і результат, що працює:
Ідеальний [дедуплікація і залиш один] SQL
Нарешті, я отримав ідеальну відповідь у технічній групі, подивіться на цей sql-вислов:
Вищенаведене sql-твердження, якщо придивитися уважно, зрозуміти ідею неважко, і, ймовірно, воно поділене на 3 етапи для розуміння:
- (ВИБРАТИ min(id) id, user_id, монетарний consume_time З consum_record ГРУПИ ЗА user_id, монетарний, consume_time НАЯВНІСТЬ COUNT(*) > 1 ) t2 Запит до дублікованих записів для формування колекції (тимчасової таблиці t2), яка містить мінімальний ID кожного дублікатного запису
- 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 секунд, дивовижно~
|