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

W zasadzie pytanie brzmi jak się z tego wydostać:

foo_id   foo_name
1        A
1        B
2        C

Do tego:

foo_id   foo_name
1        A B
2        C
Author: ustun, 2008-09-29

6 answers

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

Https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat

Z powyższego linku, GROUP_CONCAT: funkcja zwraca wynik Łańcuchowy ze skonkatenowanymi wartościami innymi niż NULL z grupy. Zwraca NULL, jeśli nie ma wartości innych niż NULL.

 562
Author: Scott Noyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-29 00:38:07
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Więcej Szczegółów TUTAJ .

Z powyższego linku, GROUP_CONCAT: funkcja zwraca wynik Łańcuchowy ze skonkatenowanymi wartościami innymi niż NULL z grupy. Zwraca NULL, jeśli nie ma wartości innych niż NULL.

 165
Author: Graeme Perrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 15:50:40
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Da ci znak rozdzielany przecinkami

 18
Author: Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-29 07:58:38
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

:- W MySQL można uzyskać skonkatenowane wartości kombinacji wyrażeń . Aby wyeliminować zduplikowane wartości, użyj klauzuli DISTINCT . Aby sortować wartości w wyniku, użyj klauzuli ORDER BY. Aby sortować w odwrotnej kolejności , dodaj DESC (malejąco) słowo kluczowe do nazwy sortowanej kolumny w klauzuli ORDER BY. Domyślną wartością jest kolejność rosnąca; może być ona określona jawnie za pomocą słowa kluczowego ASC. Domyślny separator między wartościami w grupie jest przecinek (","). Aby jawnie określić separator, użyj separatora, po którym następuje literalna wartość łańcuchowa, która powinna być wstawiona pomiędzy wartościami grupy. Aby całkowicie wyeliminować separator, należy podać 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;
 16
Author: Exundoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-29 07:58:52

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

SET group_concat_max_len=100000000;

I wtedy, na przykład:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id
 16
Author: Waqar Alamgir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-04 11:19:44

Świetne odpowiedzi. Miałem również problem z NULL i udało mi się go rozwiązać poprzez włączenie KOALESCE wewnątrz GROUP_CONCAT. Przykład w następujący sposób:

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

Hope this helps someone else

 11
Author: Mauricio Alo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-29 07:58:19