GROUP BY e GROUP_CONCAT all'interno di una query SQL

Appunti -> Sql

tipiconSQLPuò succedere di dover estrarre da una tabella di un database dei dati raggruppandoli per un determinato campo della SELECT che stiamo eseguendo e questo può essere fatto facilmente con una query del tipo:


SELECT * FROM nome_tabella GROUP BY campo_group;


Ad esempio la query
"SELECT modello, casa_produttirce FROM macchine GROUP BY casa_produttrice"
ritornerà n elementi, dove n è il numero di valori diversi per il campo casa_produttrice. In pratica se abbiamo 20 modelli di macchine, ma solo due case produttrici diverse otterremo solo 2 risultati con i il primo modello, per ciascuna casa, che la query ritornerà.

Se invece volessimo ottenere per ogni casa produttrice tutti i modelli delle macchine separati da una virgola dovremmo usare il comando GROUP_CONCAT con la seguente sintassi:

SELECT GROUP_CONCAT( campo ORDER BY campo_ordinamento SEPARATOR 'string' ) FROM nome_tabella GROUP BY campo_group;


Tornato all'esempio di cui sopra avremo:
"SELECT GROUP_CONCAT(modello ORDER BY modello SEPARATOR ', ') AS elenco modelli, casa_produttirce FROM macchine GROUP BY casa_produttrice".
Questa query tornerà due record aventi nel campo elenco_modelli, creato utilizzando il comando "AS", una stringa contenente tutti i modelli trovati, separati da una virgola.
In questo modo si riesce ad avere un report dei diversi valori del campo "modello" che altrimenti non sarebbero visibili.

E' importanche il campo_group non sia il campo su cui facciamo il GROUP_CONCAT, altrimenti la procedura è vana. Se vogliamo invece ottenere in un unico campo tutti i record salvati senza doppioni, basterà aggiugnere alla coda della query l'opzione DISTINCT ( campo )