-
Użycie GROUP_CONCAT() zwykle wywołuje logikę grupowania i tworzy tabele tymczasowe, które zwykle mają duży negatywny wpływ na wydajność. Czasami możesz dodać właściwy indeks, aby uniknąć tabeli tymczasowej w zapytaniu grupującym, ale nie w każdym przypadku.
-
Jak wskazuje @MarcB, domyślny limit długości łańcucha połączonego z grupą jest dość krótki i wiele osób zostało zdezorientowanych przez obcięte listy. Możesz zwiększyć limit za pomocą group_concat_max_len .
-
Eksploatacja ciągu w tablicę w PHP nie jest darmowa. Tylko dlatego, że możesz to zrobić w jednym wywołaniu funkcji w PHP, nie oznacza to, że jest to najlepsze dla wydajności. Nie porównałem różnicy, ale wątpię, czy ty też.
-
GROUP_CONCAT() to MySQLism. Nie jest szeroko obsługiwany przez inne produkty SQL. W niektórych przypadkach (np. SQLite) mają funkcję GROUP_CONCAT(), ale nie działa ona dokładnie tak samo jak w MySQL, więc może to prowadzić do mylących błędów, jeśli musisz obsługiwać wiele zapleczy RDBMS. Oczywiście, jeśli nie musisz się martwić o przeniesienie, to nie jest problem.
-
Jeśli chcesz pobrać wiele kolumn ze swoich
currencies
tabeli, potrzebujesz wielu wyrażeń GROUP_CONCAT(). Czy gwarantuje się, że listy będą ułożone w tej samej kolejności? To znaczy, czy trzecie pole na jednej liście odpowiada trzeciemu polu na następnej liście? Odpowiedź brzmi:nie – nie, chyba że określisz kolejność za pomocąORDER BY
klauzula wewnątrz GROUP_CONCAT().
Zwykle preferuję twój pierwszy format kodu, używam konwencjonalnego zestawu wyników i przeglądam wyniki w pętli, zapisując do nowej tablicy indeksowanej przez identyfikator klienta, dołączając waluty do tablicy. Jest to proste rozwiązanie, które sprawia, że SQL jest prosty i łatwiejszy w optymalizacji oraz działa lepiej, jeśli masz wiele kolumn do pobrania.
Nie próbuję powiedzieć, że GROUP_CONCAT() jest zła! W wielu przypadkach jest to naprawdę przydatne. Ale próba stworzenia jednej uniwersalnej reguły, aby używać (lub unikać) dowolnej funkcji lub funkcji językowej, jest uproszczona.