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.