mercoledì 13 febbraio 2013

MySQL - concatenare campi su record duplicati

Oggi mi è capitato di avere a che fare con una query con una join che mi restituiva (giustamente) record duplicati. Andiamo per esempi così ci capiamo, questa è la tabella A

mysql> SELECT * FROM A;
+------+------------+
| idA  | oggetto    |
+------+------------+
|    1 | bottiglia  |
|    2 | bastone    |
|    3 | fazzoletto |
+------+------------+
3 rows in set (0.00 sec)

e questa la tabella B

mysql> SELECT * FROM B;
+------+-----------+
| idB  | categoria |
+------+-----------+
|    1 | legno     |
|    2 | stoffa    |
|    3 | vetro     |
|    4 | carta     |
|    5 | plastica  |
+------+-----------+
5 rows in set (0.00 sec)

la terza tabella è una semplice tabella per la relazione n -> m dove vengono salvati gli accoppiamenti che vedremo con la semplice JOIN

mysql> SELECT oggetto, categoria FROM C
    -> JOIN B USING(idB)
    -> JOIN A USING(idA);
+------------+-----------+
| oggetto    | categoria |
+------------+-----------+
| bastone    | legno     |
| fazzoletto | stoffa    |
| bottiglia  | vetro     |
| fazzoletto | carta     |
| bottiglia  | plastica  |
+------------+-----------+
5 rows in set (0.00 sec)

però, per nostre esigenze, vogliamo una sola riga per oggetto. A questo punto viene in nostro aiuto la funzioncina GROUP_CONCAT e la utilizzeremo così:

mysql> SELECT oggetto, GROUP_CONCAT(categoria) FROM C
    -> INNER JOIN B USING(idB)
    -> INNER JOIN A USING(idA)
    -> GROUP BY idA;
+------------+-------------------------+
| oggetto    | GROUP_CONCAT(categoria) |
+------------+-------------------------+
| bottiglia  | plastica,vetro          |
| bastone    | legno                   |
| fazzoletto | carta,stoffa            |
+------------+-------------------------+
5 rows in set (0.00 sec)

dove idA è la chiave primaria della tabella A contenente gli oggetti.
Questo ovviamente è un utilizzo semplicistico. Ad esempio è possibile aggiungere un SEPARATOR all'interno della funzione

GROUP_CONCAT(categoria SEPARATOR '___')

in questo modo nell'esempio di prima avremmo ottenuto questo risultato

+------------+-------------------------+
| oggetto    | GROUP_CONCAT(categoria) |
+------------+-------------------------+
| bottiglia  | plastica___vetro        |
+------------+-------------------------+

Nessun commento:

Posta un commento