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