-
Použití GROUP_CONCAT() obvykle vyvolá logiku skupin podle a vytvoří dočasné tabulky, které jsou obvykle velkým negativem pro výkon. Někdy můžete přidat správný index, abyste se vyhnuli dočasné tabulce v dotazu podle skupiny, ale ne ve všech případech.
-
Jak zdůrazňuje @MarcB, výchozí limit délky řetězce zřetězeného do skupiny je docela krátký a mnoho lidí bylo zmateno zkrácenými seznamy. Limit můžete zvýšit pomocí group_concat_max_len .
-
Rozložení řetězce do pole v PHP není zadarmo. To, že to můžete udělat v jednom volání funkce v PHP, neznamená, že je to nejlepší pro výkon. Rozdíl jsem nezměřil, ale pochybuji, že vy také.
-
GROUP_CONCAT() je MySQLism. Není široce podporován jinými produkty SQL. V některých případech (např. SQLite) mají funkci GROUP_CONCAT(), ale ta nefunguje úplně stejně jako v MySQL, takže to může vést k matoucím chybám, pokud musíte podporovat více back-endů RDBMS. Samozřejmě, pokud se nemusíte starat o přenos, není to problém.
-
Pokud chcete načíst více sloupců ze svých
currencies
tabulky, pak potřebujete více výrazů GROUP_CONCAT(). Je zaručeno, že seznamy budou ve stejném pořadí? To znamená, že třetí pole v jednom seznamu odpovídá třetímu poli v následujícím seznamu? Odpověď zní ne -- ne, pokud neurčíte objednávku pomocíORDER BY
klauzule uvnitř GROUP_CONCAT().
Obvykle upřednostňuji váš první formát kódu, používám konvenční sadu výsledků a výsledky opakuji, ukládám do nového pole indexovaného podle ID klienta a připojuji měny k poli. Jedná se o přímočaré řešení, díky kterému je SQL jednoduchý a snáze se optimalizuje a funguje lépe, pokud potřebujete načíst více sloupců.
Nesnažím se říct, že GROUP_CONCAT() je špatný! V mnoha případech je to opravdu užitečné. Ale pokusit se vytvořit nějaké univerzální pravidlo pro použití (nebo se vyhnout) jakékoli funkci nebo jazykové vlastnosti je zjednodušující.