Jak używać GROUP BY do łączenia łańcuchów w MySQL?

351

Zasadniczo pytanie brzmi: jak to uzyskać:

foo_id nazwa_oooo
1 A.
1 B.
2 C.

do tego:

foo_id nazwa_oooo
1 AB
2 C.
Paweł Hajdan
źródło
13
DOWNVOTE to naprawdę mylące nazywanie ciągu kolumny, nadając mu nazwę, która wygląda jak typ danych. Tak więc wpływa to również na wszystkie odpowiedzi, ponieważ wyglądają, jakby określały typ danych, gdy określają nazwę kolumny
barlop
2
@barlop naprawił to, edytując pytania i odpowiedzi.
ustun

Odpowiedzi:

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

Więcej informacji tutaj .

Z powyższego łącza GROUP_CONCAT: ta funkcja zwraca wynik łańcucha z połączonymi wartościami innymi niż NULL z grupy. Zwraca NULL, jeśli nie ma wartości innych niż NULL.

Graeme Perrow
źródło
kolumna wynikowa ma limit znaków. patrz tutaj i dokumenty :)
marlo
18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Otrzymasz ciąg rozdzielany przecinkami

Wayne
źródło
17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - W MySQL można uzyskać połączone wartości kombinacji wyrażeń. Aby wyeliminować zduplikowane wartości, użyj klauzuli DISTINCT . Aby posortować wartości w wyniku, użyj klauzuli ORDER BY. Aby sortować w odwrotnej kolejności , dodaj słowo kluczowe DESC (malejąco) do nazwy sortowanej kolumny w klauzuli ORDER BY. Domyślnie jest to kolejność rosnąca; można to wyraźnie określić za pomocą słowa kluczowego ASC. Domyślnym separatorem między wartościami w grupie jest przecinek („,”). Aby jawnie określić separator, użyj SEPARATOR, a następnie dosłowna wartość ciągu, który należy wstawić między wartościami grupy. Aby całkowicie wyeliminować separator, określ SEPARATOR '' .

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

LUB

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;
Exundoz
źródło
15

Wynik jest obcięty do maksymalnej długości podanej przez zmienną systemową group_concat_max_len, która ma domyślną wartość 1024 znaków, więc najpierw:

SET group_concat_max_len=100000000;

a następnie na przykład:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id
Waqar Alamgir
źródło
Rezultatem jest obcinany do długości maksymalnej, która jest podana przez group_concat_max_len zmiennej systemowej, która ma wartość domyślną z 1024 znaków. docs
marlo
Jaki jest zakres tej group_concat_max_lenkonfiguracji? Bieżące połączenie / sesja, czy wpłynie to na innych klientów?
Frozen Flame
@FrozenFlame:> Jeśli nie ma modyfikatora, SET zmienia zmienną sesji. Jeśli zmienna nie ma wartości sesji, występuje błąd. Od dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu
3
To nie odpowiada na pytanie PO, a jedynie dodaje pomocnych informacji. To powinien być komentarz, a nie odpowiedź.
Sean the Bean,
1
Dziękujemy za ten fragment kodu, który może zapewnić pewną ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu i byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
Kaczor Donald
11

Świetne odpowiedzi. Miałem również problem z NULLS i udało mi się go rozwiązać, włączając WSPÓŁPRACĘ wewnątrz GROUP_CONCAT. Przykład w następujący sposób:

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

Mam nadzieję, że to pomaga komuś innemu

Mauricio Alo
źródło