Come usare GROUP BY per concatenare le stringhe in MySQL?


351

Fondamentalmente la domanda è come ottenere da questo:

foo_id foo_name
1 A
1 B
2 C.

a questo:

foo_id foo_name
1 AB
2 C.

13
DOWNVOTE è davvero confuso nominare una stringa di colonna, dandole un nome che assomiglia a un tipo di dati. Quindi anche tutte le risposte ne risentono poiché le risposte sembrano specificare un tipo di dati quando specificano un nome di colonna
barlop

2
@barlop ha risolto il problema modificando domande e risposte.
ustun

Risposte:



164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Maggiori dettagli qui .

Dal link sopra GROUP_CONCAT: questa funzione restituisce un risultato di stringa con i valori non NULL concatenati di un gruppo. Restituisce NULL se non ci sono valori non NULL.


la colonna risultante ha un limite di caratteri. vedi qui e la documentazione :)
marlo,

18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Ti darà una stringa delimitata da virgole


17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - In MySQL, puoi ottenere i valori concatenati delle combinazioni di espressioni. Per eliminare valori duplicati, utilizzare la clausola DISTINCT . Per ordinare i valori nel risultato, utilizzare la clausola ORDER BY. Per ordinare in ordine inverso , aggiungi la parola chiave DESC (decrescente) al nome della colonna per cui stai ordinando nella clausola ORDER BY. L'impostazione predefinita è ordine crescente; questo può essere specificato esplicitamente usando la parola chiave ASC. Il separatore predefinito tra i valori in un gruppo è la virgola (“,”). Per specificare esplicitamente un separatore, utilizzare SEPARATOR seguito dal valore letterale stringa che deve essere inserito tra i valori di gruppo. Per eliminare del tutto il separatore, specificare SEPARATORE '' .

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

O

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

15

Il risultato viene troncato alla lunghezza massima fornita dalla variabile di sistema group_concat_max_len, che ha un valore predefinito di 1024 caratteri, quindi per prima cosa facciamo:

SET group_concat_max_len=100000000;

e quindi, ad esempio:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

Il risultato viene troncato alla lunghezza massima fornita dalla variabile di sistema group_concat_max_len, che ha un valore predefinito di 1024 caratteri. docs
marlo,

Qual è lo scopo di questa group_concat_max_lenconfigurazione? Connessione / sessione corrente o interesserà altri client?
Frozen Flame,

@FrozenFlame:> Se non è presente alcun modificatore, SET modifica la variabile di sessione. Se la variabile non ha valore di sessione, si verifica un errore. Da dev.mysql.com/doc/refman/5.7/it/using-system-variables.html
arminrosu

3
Ciò non risponde alla domanda del PO ma aggiunge semplicemente informazioni utili. Questo dovrebbe essere un commento, non una risposta.
Sean the Bean,

1
Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
Paperino,

11

Grandi risposte. Ho anche avuto un problema con NULLS e sono riuscito a risolverlo includendo un COALESCE all'interno di GROUP_CONCAT. Esempio come segue:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

Spero che questo aiuti qualcun altro

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.