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

289

В основном возникает вопрос, как это сделать:

id    string
1          A
1          B
2          C

:

id    string
1          A B
2          C
  • 6
    ЗАГРУЗИТЬ действительно сложно ввести имя столбца, присвоив ему имя, похожее на тип данных. Таким образом, на любые ответы также влияет это, так как ответы выглядят так, как будто они указывают тип данных, когда они задают имя столбца.
Теги:
string
aggregate
concatenation

6 ответов

423
Лучший ответ
SELECT id, GROUP_CONCAT(string 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, из группы. Он возвращает NULL, если нет значений, отличных от NULL.

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

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

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

  • 0
    результирующий столбец имеет ограничение в символах. смотрите здесь и документы :)
15
SELECT id, GROUP_CONCAT(CAST(string as CHAR)) FROM table GROUP BY id

Дает вам строку с разделителями-запятыми

12
SET group_concat_max_len=100000000
  • 0
    Результат усекается до максимальной длины, заданной системной переменной group_concat_max_len со значением по умолчанию 1024 символа. документы
  • 0
    Какова область действия этой конфигурации group_concat_max_len ? Текущее соединение / сеанс, или это повлияет на других клиентов?
Показать ещё 3 комментария
11
SELECT id, GROUP_CONCAT(string 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;
4

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню