Kilka dni temu, gdy robiłem wymagania, musiałem wyczyścić zduplikowane rekordy w mysql, a wtedy chodziło o napisanie tego przez code traversal, a potem uznałem, że to zbyt skomplikowane, myśląc, że problem powinienem rozwiązać za pomocą instrukcji sql. Po sprawdzeniu informacji i konsultacji z szefem opracowałem bardzo wygodne sformułowanie sql, a tutaj podzielę się tym stwierdzeniem i pomysłami.
Analiza potrzeb
Jeśli w bazie danych występują duplikaty, usuń i zachowaj jeden z nich (niezależnie od tego, czy kryteria określania ich to wiele pól)
rozwiązanie
Kiedy napotkasz tę potrzebę, prawdopodobnie masz w sercu jakiś pomysł. Najszybciej, co wymyśliłem, to że mógłbym rozwiązać to za pomocą instrukcji sql, ale byłem zbyt płytki w złożonych instrukcjach sql, więc chciałem poprosić szefa o pomoc.
Znajdź kogoś, kto pomoże
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Own Baidu
Znalazłem wyrażenie sql:
Ten pomysł SQL jest oczywisty, są następujące 3 kroki:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Zapytaj duplikowane rekordy w tabeli jako warunek
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Drugi warunek to najmniejsza wartość ID w zduplikowanych rekordach w tabeli zapytań
- Na koniec, zgodnie z powyższymi dwoma warunkami, usuń pozostałe zduplikowane rekordy z wyjątkiem najmniejszego identyfikatora w rekordzie duplikatycznym
Niestety, wystąpił błąd w uruchamianiu tego stwierdzenia, co mniej więcej oznacza, że tabela nie może być aktualizowana jednocześnie z zapytaniem.
Kod rozwiązany
Na podstawie powyższego stwierdzenia SQL myślę, że możesz osiągnąć ten sam cel w dwóch krokach za pomocą kodu:
- Najpierw usuwane są duplikaty zbiorów danych
- Na podstawie zapytania, pozostałe duplikaty są usuwane w pętli
Miałem pomysł i napisałem go szybko, ale byłem w szoku, gdy go uruchomiłem, a naprawdę go potrzebowałem116lewo i prawo, a potem chcę znaleźć polecenie SQL, którego mogę użyć, wkleić kod i wynik uruchomiony:
Idealny [deduplikacja i zostawienie jednego] SQL
Na koniec otrzymałem idealną odpowiedź w grupie technicznej, spójrz na to stwierdzenie sql:
Powyższe stwierdzenie o sql, jeśli przyjrzeć się uważnie, nie jest trudno zrozumieć ideę i prawdopodobnie jest podzielona na 3 kroki, aby zrozumieć:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2 Zapytaj zduplikowane rekordy, aby utworzyć kolekcję (tymczasowa tabela t2), która zawiera minimalny identyfikator każdego duplikowanego rekordu
- consum_record.user_id = t2.user_id oraz consum_record.monetary = t2.monetary oraz consum_record.consume_time = t2.consume_time Pola powiązane dla zduplikowanych kryteriów
- Usuwanie rekordów z ID większymi niż ID w T2 zgodnie z warunkami
Kiedy zobaczyłem to zdanie, pomyślałem, że to zbyt potężne. Tak proste sformułowanie sql może rozwiązać tak złożony problem, a postawa rośnie~ Jest też bardzo szybki w uruchomieniu, oryginalne wykonanie pętli kodu zajmuje około 116 sekund, ale tutaj wystarczy 0,3 sekundy, niesamowite~
|