Commenti(0)
La funzione di aggregazione GROUP_CONCAT()
L’articolo descrive la funzione di aggregazione group_concat() partendo da un rapido excursus teorico alle applicazioni pratiche
Dalla versione 4.1 MySQL fornisce la funzione GROUP_CONCAT(). Questa è una funzione di aggregazione che consente concatenare in un’unica stringa un gruppo di valori che normalmente si trovano su record differenti. Un esempio per chiarire:
E’ facile intuire che la tabella libro_autore rappresenta un’associazione “molti a molti” tra i libri e gli autori. La qui presente doppia JOIN restituisce, per ogni libro, tutti i suoi autori. Grazie alla funzione GROUP_CONCAT() però ogni associazione libro-autore non è un singolo record. Vi è infatti, un unico record per ogni libro e tutti gli autori sono elencati nel valore “autori”, separati da virgole. Un esempio di possibili risultati è il seguente:
titolo: The C Programming Language autori: B. W. Kernighan,Dennis Ritchie titolo: La gioia armata autori: A. M. BonannoVi sono poi alcuni parametri che rendono il suo utilizzo più flessibile e più comodo all’interno di una applicazione. Ecco la sintassi completa:
Nella maggior parte dei casi, useremo GROUP_CONCAT() per ottenere la lista dei valori presenti in un campo A che sono associati a determinati valori presenti in un campo B. Nell’esempio, otteniamo una lista di autori che sono associati ad ogni singolo titolo. Per fare questo, naturalmente, si usa la clausola GROUP BY. Si può non usarla se si desidera concatenare in un’unica stringa tutti i valori esistenti in una tabella, ma questo è un caso piuttosto raro; inoltre non è consigliabile su tabelle di dimensioni medio-grandi perchè la query risulterebbe piuttosto impegnativa per il server. Infine, teniamo presente che in un database relazionale è piuttosto frequente che le query contenenti GROUP_CONCAT() coinvolgano più di una tabella (JOIN).
Il separatore
Poiché lo scopo principale di GROUP_CONCAT() è fornire un elenco di valori già pronti per essere visualizzati, è utile impostare il carattere o i caratteri che devono separare questi valori. Il separatore predefinito è la virgola, senza alcuno spazio prima o dopo. Questo va bene nel caso si voglia ottenere una stringa che PHP “esploderà” in un array tramite la funzione explode() (o qualche altro linguaggio la esploderà con qualche altra funzione). Anche questo però è possibile solo se i valori da concatenare non contengono virgole, altrimenti bisognerà utilizzare un altro carattere. Il seguente esempio mostra come concatenare valori separandoli con una virgola e uno spazio, in modo che possano avere un aspetto gradevole e comprensibile alle persone che li usano senza modifiche da parte di PHP o altri linguaggi:
L’ordinamento
L’ordine dei valori restituiti dalla clausola GROUP_CONCAT() possono essere modificato nella query, per fare ciò si utilizza la clausola ORDER BY di GROUP_CONCAT(). Il suo utilizzo è sintatticamente identico a quello dell’ORDER BY delle SELECT. Infatti permette di specificare il nome di un campo, il numero della sua posizione, oppure una qualsiasi espressione SQL. Si può anche utilizzare le parole chiave ASC (ascending; è l’ordinamento predefinito) e DESC (descending). La clausola ORDER BY di GROUP_CONCAT() però non va confusa con l’ORDER BY che accompagna le SELECT. Bisogna infatti ricordare che la prima influenza l’ordinamento dei valori concatenati da GROUP_CONCAT() (esempio: “autore1, autore2, autore3”), mentre la seconda influenza l’ordine dei record. Bisogna ricordare che, poiché spesso saremo in presenza di una query con GROUP BY, per default è questa clausola a determinare l’ordinamento dei record. Essa ammette l’uso delle parole chiave ASC e DESC:
1SELECT ... GROUP BY autore DESC
Esempio di uso di ORDER BY:
1SELECT ... GROUP BY autore ORDER BY id
Se infine si desidera che i record vengano restituiti in ordine sparso (ma questo non migliorerà le prestazioni della query):
1SELECT ... GROUP BY autore ORDER BY NULL
Un esempio di query completa:
Distinct
Se esistono valori duplicati, per default GROUP_CONCAT() li restituirà tutti. Nella “vita reale” in genere questo non può avvenire; se però la possibilità esiste, potremmo voler eliminare tali valori:
Prestazioni
Spesso l’uso di GROUP_CONCAT() può ridurre le comunicazioni tra il client e il server MySQL, che generalmente costituiscono uno dei colli di bottiglia. Inoltre la funzione in sè sembra essere abbastanza veloce.
Limiti
Vi è un limite al numero di record che possono essere concatenati. Esso è rappresentato dalla variabile group_concat_max_len, il cui valore predefinito è 1024. La variabile è modificabile a run time.
Esempio:
1SET GLOBAL group_concat_max_len=4096
Se poi desideriamo modificare in modo permanente tale limite, basta agire sul file my.cnf.
Condividi su:
Esprimi un voto:
Argomenti chiave:

MySQL Report un tool di shell per tenere tutto sotto controllo