Как использовать GROUP BY для конкатенации строк в MySQL?

В основном вопрос заключается в том, как получить из этого:

foo_id   foo_name
1        A
1        B
2        C

на это:

foo_id   foo_name
1        A B
2        C

Ответ 1

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

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

По ссылке выше, GROUP_CONCAT: эта функция возвращает строковый результат с объединенными ненулевыми значениями из группы. Возвращает NULL, если нет ненулевых значений.

Ответ 2

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

Подробнее здесь.

Из приведенной выше ссылки GROUP_CONCAT: эта функция возвращает результат строки с объединенными значениями, отличными от NULL, из группы. Он возвращает NULL, если нет значений, отличных от NULL.

Ответ 3

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

Даст вам строку через запятую

Ответ 4

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

: - В MySQL вы можете получить объединенные значения комбинаций выражений , Чтобы исключить повторяющиеся значения, используйте предложение DISTINCT. Чтобы отсортировать значения в результате, используйте предложение ORDER BY. Для сортировки в обратном порядке добавьте ключевое слово DESC (по убыванию) к имени столбца, по которому вы сортируете, в предложении ORDER BY. По умолчанию это возрастающий порядок; это можно указать явно, используя ключевое слово ASC. Разделителем по умолчанию между значениями в группе является запятая (','). Чтобы явно указать разделитель, используйте 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;

Ответ 5

Результат усекается до максимальной длины, заданной системной переменной 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

Ответ 6

Отличные ответы. У меня также была проблема с NULLS, и мне удалось ее решить, добавив COALESCE в GROUP_CONCAT. Пример следующим образом:

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

Надеюсь, это поможет кому-то еще