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.

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.


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


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;

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.