Як використовувати GROUP BY для об'єднання рядків у MySQL?


351

В основному питання полягає в тому, як отримати від цього:

foo_id foo_name
1 А
1 Б
2 С

до цього:

foo_id foo_name
1 AB
2 С

13
DOWNVOTE називати рядок стовпця дійсно заплутано, даючи йому ім’я, схоже на тип даних. Тож на будь-які відповіді також впливає це, оскільки відповіді виглядають так, як вони вказують тип даних, коли вони вказують назву стовпця
барлоп

2
@barlop це виправив, редагуючи питання та відповіді.
ustun

Відповіді:



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

Детальніше тут .

З вищенаведеного посилання GROUP_CONCAT: Ця функція повертає рядковий результат із об'єднаними значеннями не-NULL з групи. Він повертає NULL, якщо немає значення NULL.


отриманий стовпець має обмеження в символах. дивіться тут і документи :)
marlo

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

Дасть вам рядки з комою


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

: - У MySQL ви можете отримати об'єднані значення комбінацій виразів. Для усунення повторюваних значень використовуйте пункт DISTINCT . Для сортування значень у результаті використовуйте пункт ORDER BY. Щоб сортувати у зворотному порядку , додайте ключове слово DESC (у зменшенні) до назви стовпця, за яким Ви сортуєте, у пункті ЗАМОВИТИ ЗА. За замовчуванням - порядку зростання; це може бути визначено явно за допомогою ключового слова ASC. Типовим роздільником між значеннями в групі є кома (“,”). Щоб чітко вказати роздільник, використовуйте SEPARATOR з наступним буквеним значенням рядка, яке слід вставити між значеннями групи. Щоб повністю усунути роздільник, вкажіть SEPARATOR '' .

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

АБО

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

15

Результат обрізається до максимальної довжини, яка задається системною змінною group_concat_max_len, яка має значення за замовчуванням 1024 символи, тому спочатку робимо:

SET group_concat_max_len=100000000;

а потім, наприклад:

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

Результат буде скорочуватися до довжини максимального, заданого з допомогою group_concat_max_len системної змінної, яка має значення по замовчуванням з 1024 символів. docs
marlo

Яка сфера застосування цієї group_concat_max_lenконфігурації? Поточне з'єднання / сеанс, чи це вплине на інших клієнтів?
Заморожене полум'я

@FrozenFlame:> Якщо модифікатора немає, SET змінює змінну сеансу. Якщо змінна не має значення сеансу, виникає помилка. Від dev.mysql.com/doc/refman/5.7/uk/using-system-variables.html
arminrosu

3
Це не відповідає на питання ОП, але лише додає корисну інформацію. Це має бути коментар, а не відповідь.
Шон Бін

1
Дякуємо за цей фрагмент коду, який може надати деяку обмежену, негайну допомогу. Належне пояснення буде значно поліпшити свою довгострокову цінність, показуючи , чому це є хорошим рішенням проблеми і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка , змініть свій відповідь , щоб додати деякі пояснення, в тому числі припущень , які ви зробили.
Дональд Дак

11

Чудові відповіді. У мене також була проблема з NULLS і мені вдалося її вирішити, включивши COALESCE всередину GROUP_CONCAT. Приклад наступний:

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

Сподіваюся, це допоможе комусь іншому

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.