GROUP_CONCAT() în MySQL

Lipește valorile unui grup într-un singur text, de exemplu toate produsele unei comenzi.

Sintaxă
GROUP_CONCAT([DISTINCT] expresie [ORDER BY ...] [SEPARATOR 'text'])

Ce face GROUP_CONCAT()

GROUP_CONCAT() este o funcție de agregare: pentru fiecare grup din GROUP BY, unește valorile într-un text. Implicit le separă prin virgulă; poți alege alt separator, ordinea și eliminarea duplicatelor.

Lungimea rezultatului este limitată de variabila group_concat_max_len (implicit 1024 de octeți). Textul mai lung este tăiat, cu un avertisment.

Parametri

Parametru Descriere
DISTINCT Opțional. Elimină valorile duplicate.
expresie Valoarea unită.
ORDER BY Opțional. Ordinea valorilor în text.
SEPARATOR Opțional. Textul dintre valori (implicit ',').

Ce returnează

Textul unit sau NULL dacă toate valorile sunt NULL.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE vanzari (
  agent VARCHAR(20),
  oras VARCHAR(20),
  luna INT,
  suma INT
);

INSERT INTO vanzari VALUES
  ('Ana', 'Iași', 1, 1200), ('Ana', 'Iași', 2, 1500), ('Ana', 'Iași', 3, 900),
  ('Dan', 'Cluj', 1, 900), ('Dan', 'Cluj', 2, 900), ('Dan', 'Cluj', 3, 1700),
  ('Ioana', 'Iași', 1, 2000), ('Ioana', 'Iași', 2, 1100);

Exemplul 1: Agenții din fiecare oraș

SELECT oras, GROUP_CONCAT(DISTINCT agent ORDER BY agent SEPARATOR ', ') AS agenti
FROM vanzari
GROUP BY oras
ORDER BY oras;

Rezultat

+-------+------------+
| oras  | agenti     |
+-------+------------+
| Cluj  | Dan        |
| Iași  | Ana, Ioana |
+-------+------------+

Exemplul 2: Toate sumele unui agent, în ordinea lunilor

SELECT agent, GROUP_CONCAT(suma ORDER BY luna SEPARATOR ' → ') AS evolutie
FROM vanzari
GROUP BY agent
ORDER BY agent;

Rezultat

+-------+-----------------------+
| agent | evolutie              |
+-------+-----------------------+
| Ana   | 1200 → 1500 → 900     |
| Dan   | 900 → 900 → 1700      |
| Ioana | 2000 → 1100           |
+-------+-----------------------+

Greșeli frecvente

  • Folosești GROUP_CONCAT() pe grupuri mari și pierzi date fără să observi: textul este tăiat la 1024 de octeți. Mărește limita cu SET SESSION group_concat_max_len = 100000;.

Comenzi înrudite

  • GROUP BY: Grupează rândurile cu aceeași valoare, ca să calculezi totaluri pentru fiecare grup.
  • JSON_ARRAYAGG(): Funcție de agregare: strânge valorile unui grup într-o listă JSON.