1. MySQL GROUP_CONCAT() funktsiooni põhikasutus
GROUP_CONCAT()
on MySQL-i agregeerimisfunktsioon, mis ühendab mitme rea väärtused üheks stringiks. See võimaldab koondada mitu andmepunkti ühte välja. Eriti kasulik on see siis, kui soovitakse andmeid koondada või aruannetes tõhusalt kuvada.
Põhisüntaks
GROUP_CONCAT()
funktsiooni põhisüntaks on järgmine:
SELECT GROUP_CONCAT(column_name) FROM table_name GROUP BY column_name;
Seda funktsiooni kasutatakse tavaliselt koos GROUP BY
klausliga. Näiteks, päring, mis loetleb töötajate nimed osakonna kaupa, näeks välja järgmine:
SELECT department, GROUP_CONCAT(employee_name) FROM employees GROUP BY department;
Tulemuseks on see, et iga osakonna töötajate nimed tagastatakse komadega eraldatud stringina.
2. GROUP_CONCAT() kohandamise võimalused
GROUP_CONCAT()
funktsioon ei piira end vaid väärtuste ühendamisega – seda saab kohandada mitmel viisil, näiteks eraldajate muutmine, duplikaatide eemaldamine või sortimisjärjekorra määramine.
2.1 Eraldaja muutmine
Vaikimisi eraldab GROUP_CONCAT()
väärtused komadega, kuid SEPARATOR
märksõna abil saab seda muuta. Näiteks, kui soovite töötajate nimed eraldada semikooloniga:
SELECT department, GROUP_CONCAT(employee_name SEPARATOR '; ') AS employees
FROM employees
GROUP BY department;
Selle päringu tulemuseks on semikoolonitega eraldatud töötajate nimede loend.
2.2 Duplikaatide eemaldamine
Vaikimisi liidab GROUP_CONCAT()
ka korduvad väärtused, kuid kasutades märksõna DISTINCT
, saab duplikaadid eemaldada. Näide:
SELECT department, GROUP_CONCAT(DISTINCT employee_name) AS employees
FROM employees
GROUP BY department;
2.3 Tulemuste sorteerimine
GROUP_CONCAT()
võimaldab määrata liidetavate väärtuste järjestuse. ORDER BY
klausliga saab need sorteerida kasvavas või kahanevas järjekorras. Näide tähestikulises järjestuses:
SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department;
Kui soovite kahanevas järjekorras, kasutage DESC
.
3. GROUP_CONCAT() praktilised näited
3.1 Tootenimekiri kategooria kaupa
GROUP_CONCAT()
abil saab koostada tootenimekirja iga kategooria jaoks. Näiteks:
SELECT category, GROUP_CONCAT(product_name ORDER BY product_name ASC) AS product_list
FROM products
GROUP BY category;
Tulemus:
category product_list
Electronics Laptop, Phone, TV
Furniture Sofa, Table
3.2 Mitme veeru ühendamine
Mitme veeru väärtuste ühendamiseks saab kasutada kohandatud eraldajaid. Näiteks:
SELECT category, GROUP_CONCAT(CONCAT(product_id, ':', product_name) ORDER BY product_name) AS product_info
FROM products
GROUP BY category;
Tulemuseks on toote ID ja nime kombinatsioon iga kategooria jaoks.
4. GROUP_CONCAT() piirangud ja jõudluse optimeerimine
GROUP_CONCAT()
-il on vaikimisi 1024 märgi piirang. Suure andmehulgaga töötades tuleb jälgida ka jõudlust.
4.1 Maksimaalse pikkuse muutmine
Kui väljundi pikkus ületab piirangu, saab seda muuta seansi seadistuses. Näiteks:
SET SESSION group_concat_max_len = 10000;
4.2 Jõudluse optimeerimine
Suure andmehulgaga võivad DISTINCT
ja ORDER BY
aeglustada töötlemist. Optimeerimiseks:
- Kasuta indekseid: loo indeks veerule, mida kasutatakse
GROUP BY
klauslis. - Seadista maksimaalne pikkus: reguleeri
group_concat_max_len
vastavalt vajadusele.
5. Võrdlus teiste agregeerimisfunktsioonidega
GROUP_CONCAT()
erineb teistest agregeerimisfunktsioonidest (nt COUNT()
, SUM()
) selle poolest, et ta ühendab väärtusi stringiks, mitte ei arvuta numbrilist tulemust.
5.1 Erinevus COUNT()
funktsioonist
COUNT()
loendab ridu vastavalt tingimusele, GROUP_CONCAT()
aga ühendab väärtused stringiks. Näiteks:
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department;
See tagastab iga osakonna töötajate arvu.
6. Kokkuvõte
GROUP_CONCAT()
on paindlik agregeerimisfunktsioon MySQL-is. See võimaldab ühendada andmed üheks stringiks ja kohandada väljundit vastavalt vajadusele, mis teeb selle väga kasulikuks aruannete ja andmeanalüüsi jaoks. Siiski tuleb arvestada pikkuse piirangut ja jõudluse aspekte. Koos teiste agregeerimisfunktsioonidega saab saavutada veelgi tõhusama andmetöötluse.