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!