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

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

foo_id   foo_name
1        A
1        B
2        C

к этому:

foo_id   foo_name
1        A B
2        C

DOWNVOTE действительно сбивает с толку назвать строку столбца, давая ей имя, которое выглядит как тип данных. Таким образом, любые ответы также зависят от этого, поскольку ответы выглядят так, как будто они указывают тип данных, когда они указывают имя столбца.

barlop 11.04.2018 19:31

@barlop исправил это, отредактировав вопросы и ответы.

ustun 29.08.2019 10:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
378
2
274 121
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

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

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

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

результирующий столбец имеет предел в символах. см. здесь и документы :)

marlo 26.01.2016 12:53

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

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

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

marlo 26.01.2016 12:48

Каков объем этой конфигурации group_concat_max_len? Текущее соединение / сеанс, или это повлияет на других клиентов?

Frozen Flame 28.06.2016 11:34

@FrozenFlame:> Если модификатор отсутствует, SET изменяет переменную сеанса. Если переменная не имеет значения сеанса, возникает ошибка. От dev.mysql.com/doc/refman/5.7/en/using-system-variables.html

arminrosu 16.02.2017 15:56

Это не отвечает на вопрос OP, а просто добавляет полезную информацию. Это должен быть комментарий, а не ответ.

Sean the Bean 07.12.2017 17:49

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

Donald Duck 14.12.2017 01:39

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

: - В MySQL вы можете получить конкатенированные значения комбинаций выражений . Чтобы исключить повторяющиеся значения, используйте предложение ОТЧЕТЛИВЫЙ. Чтобы отсортировать значения в результате, используйте предложение 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;

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

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

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

Другие вопросы по теме