.## 1. Základní použití funkce MySQL GROUP_CONCAT()
GROUP_CONCAT() je agregační funkce MySQL, která spojuje hodnoty z více řádků do jediného řetězce. To vám umožní sloučit několik položek dat do jednoho pole. Je zvláště užitečná, když chcete efektivně zobrazit agregované nebo souhrnné výsledky.
Základní syntaxe
Základní syntaxe GROUP_CONCAT() vypadá následovně:
SELECT GROUP_CONCAT(column_name) FROM table_name GROUP BY column_name;
Tato funkce se obvykle používá společně s klauzulí GROUP BY. Například následující dotaz vypíše jména zaměstnanců seskupená podle oddělení:
SELECT department, GROUP_CONCAT(employee_name) FROM employees GROUP BY department;
Výsledkem jsou jména zaměstnanců patřících do každého oddělení jako řetězec oddělený čárkami.
2. Možnosti přizpůsobení funkce GROUP_CONCAT()
Funkce GROUP_CONCAT() dělá víc než jen prosté spojení hodnot – nabízí různé možnosti přizpůsobení. Můžete změnit oddělovač, odstranit duplicitní hodnoty a určit pořadí řazení pro pokročilejší použití.
2.1 Změna oddělovače
Ve výchozím nastavení GROUP_CONCAT() odděluje hodnoty čárkami. Můžete však změnit oddělovač pomocí klíčového slova SEPARATOR. Například pro oddělení jmen zaměstnanců středníky:
SELECT department, GROUP_CONCAT(employee_name SEPARATOR '; ') AS employees
FROM employees
GROUP BY department;
Tento dotaz vrátí jména zaměstnanců oddělená středníky.
2.2 Odstraňování duplicitních hodnot
Ve výchozím nastavení GROUP_CONCAT() zahrnuje všechny duplicitní hodnoty. Duplicit můžete odstranit pomocí klíčového slova DISTINCT. Níže je ukázkový dotaz, který eliminuje duplicitní jména zaměstnanců:
SELECT department, GROUP_CONCAT(DISTINCT employee_name) AS employees
FROM employees
GROUP BY department;
2.3 Řazení výsledků
Můžete řídit pořadí spojovaných prvků v rámci GROUP_CONCAT(). Pomocí klauzule ORDER BY můžete řadit hodnoty vzestupně nebo sestupně. Následující příklad řadí jména zaměstnanců abecedně:
SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department;
Tento dotaz spojuje jména zaměstnanců v abecedním pořadí. Pro řazení sestupně použijte DESC.
3. Pokročilé případy použití funkce GROUP_CONCAT()
3.1 Vytváření seznamů produktů podle kategorie
Můžete použít GROUP_CONCAT() k vytvoření seznamu názvů produktů pro každou kategorii. Například následující dotaz získá názvy produktů seřazené abecedně v rámci každé kategorie:
SELECT category, GROUP_CONCAT(product_name ORDER BY product_name ASC) AS product_list
FROM products
GROUP BY category;
Výsledek bude zobrazen následovně:
category product_list
Electronics Laptop, Phone, TV
Furniture Sofa, Table

3.2 Spojování více sloupců
Při kombinování více sloupců pomocí GROUP_CONCAT() můžete sloupce spojit vlastním oddělovačem. V následujícím příkladu jsou ID produktu a název produktu spojeny dvojtečkou a sloučeny do jednoho řetězce:
SELECT category, GROUP_CONCAT(CONCAT(product_id, ':', product_name) ORDER BY product_name) AS product_info
FROM products
GROUP BY category;
Tento dotaz vrátí ID produktu a název produktu spojené dohromady pro každou kategorii.
4. Omezení a ladění výkonu funkce GROUP_CONCAT()
Při používání GROUP_CONCAT() existuje výchozí limit délky výstupu 1024 znaků. Navíc při práci s velkými datovými sadami se stávají důležitými úvahy o výkonu.
4.1 Změna maximální délky řetězce
Pokud je výchozí maximální délka nedostatečná, můžete upravit nastavení relace a zvýšit povolenou délku výsledku. Následující dotaz nastaví maximální délku relace na 10 000 bajtů:
SET SESSION group_concat_max_len = 10000;
.S touto konfigurací můžete správně získávat výsledky i z větších datových sad.
4.2 Optimalizace výkonu
Při práci s velkým množstvím dat může výkon funkce GROUP_CONCAT() představovat problém. Zejména časté používání DISTINCT a ORDER BY může prodlužovat dobu zpracování. Pro optimalizaci výkonu zvažte následující body:
- Používejte indexy: Přidání indexů na sloupce použité ve výrazu
GROUP BYmůže výrazně zlepšit výkon dotazu. - Nastavte vhodnou maximální délku: Podle potřeby upravte
group_concat_max_len, aby nedocházelo k vytváření zbytečně velkých výsledných sad.
5. Srovnání s ostatními agregačními funkcemi
GROUP_CONCAT() se liší od ostatních agregačních funkcí (např. COUNT() a SUM()), protože spojuje data do jediného řetězce. V této sekci vysvětlujeme rozdíl mezi GROUP_CONCAT() a COUNT().
5.1 Rozdíl od COUNT()
COUNT() je funkce používaná k počítání počtu řádků, které splňují konkrétní podmínku. Zatímco GROUP_CONCAT() spojuje a vrací řetězce, COUNT() vrací číselnou hodnotu. Například následující dotaz počítá počet zaměstnanců v každém oddělení:
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department;
Tímto můžete zjistit, kolik zaměstnanců patří do jednotlivých oddělení.
6. Závěr
GROUP_CONCAT() je jednou z nejobtížnějších (nejflexibilnějších) agregačních funkcí v MySQL. Protože kombinuje data do jediného řetězce a umožňuje přizpůsobení i pokročilé použití, je vysoce efektivní pro vizualizaci databází a generování reportů. Je však nutné mít na paměti omezení délky znaků a možné dopady na výkon a v případě potřeby nastavit odpovídající parametry. Kombinací s dalšími agregačními funkcemi můžete dosáhnout ještě výkonnější manipulace s daty.


