В основном вопрос в том, как из этого получить:
foo_id foo_name 1 A 1 B 2 C
к этому:
foo_id foo_name 1 A B 2 C
@barlop исправил это, отредактировав вопросы и ответы.


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.
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 символов. документы
Каков объем этой конфигурации group_concat_max_len? Текущее соединение / сеанс, или это повлияет на других клиентов?
@FrozenFlame:> Если модификатор отсутствует, SET изменяет переменную сеанса. Если переменная не имеет значения сеанса, возникает ошибка. От dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
Это не отвечает на вопрос OP, а просто добавляет полезную информацию. Это должен быть комментарий, а не ответ.
Спасибо за этот фрагмент кода, который может оказать некоторую немедленную помощь. правильное объяснение значительно улучшит его долгосрочную ценность, показывая, почему это хорошее решение проблемы, и сделает его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, редактировать свой ответ, чтобы добавить некоторые пояснения, включая сделанные предположения.
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;
Надеюсь, это поможет кому-то другому
DOWNVOTE действительно сбивает с толку назвать строку столбца, давая ей имя, которое выглядит как тип данных. Таким образом, любые ответы также зависят от этого, поскольку ответы выглядят так, как будто они указывают тип данных, когда они указывают имя столбца.