Wyszukiwanie duplikatów w bazie danych MySQL

Czołem!

Miałem dzisiaj krótką batalię z jedną tabelką w bazie. Tak wygląda jej struktura:

Posiada ona klucz unikalny na dwa pola, page_id oraz name. Akurat pisaliśmy migrację która robiła TRIM() na polu name. Jednak migracja się wykładała ponieważ były wpisy duplikaty z białymi znakami. Problem który musiałem rozwiązać to sposób w jaki wyszukać te duplikaty i je poprawić.

Potrzebne było więc zapytanie które wyciągnie duplikaty name po usunięciu białych znaków, pogrupowane po page_id. Oto finalne zapytanie:

SELECT
  GROUP_CONCAT(CONCAT_WS(':', content.page_id, content.name)) AS data
FROM content
GROUP BY content.page_id, TRIM(content.name)
HAVING COUNT(content.page_id) > 1

Od początku. CONCAT_WS() złącza nam dwa pola, content.page_id wraz z content.name za pomocą znaku dwukropka w tym przypadku. Dzięki czemu otrzymamy dane w formacie page_id:name.

Następnie wynik tego złączenia jest przekazywany do funkcji GROUP_CONCAT() która złącza nam wszystkie wiersze po których jest grupowanie używając znaku przecinka.

Samo grupowanie (GROUP BY) jest po kolumnie page_id oraz name po wyczyszczeniu z białych znaków.

Na koniec dochodzi wybranie wszystkich rekordów w których dany page_id występuje więcej niż jeden raz.

Dzięki czemu otrzymałem takie wyniki:

data
223:CMS,223: CMS
7432:Module 2 ,7432: Module 2

Mają już wyciągnięte dane wystarczy je w pętli w PHP “obrobić”. Wystarczy iteracja po wierszach, rozbić dane używając przecinka, następnie dwukropka by na koniec zrobić operację UPDATE 🙂

PS. Jeśli masz lepszy patent na wyciąganie danych z bazy to koniecznie zostaw komentarz!