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!

