Могу ли я объединить несколько строк MySQL в одно поле?

850

Используя MySQL, я могу сделать что-то вроде:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

и получим:

shopping
fishing
coding

но вместо этого я просто хочу 1 строку, 1 col:

shopping, fishing, coding

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

Я искал функцию MySQL Doc и не похож на результат приема CONCAT или CONCAT_WS устанавливает, так кто-нибудь здесь знает, как это сделать?

  • 8
    Я только что написал небольшую демонстрацию о том, как использовать group_concat, которая может быть вам полезна: giombetti.com/2013/06/06/mysql-group_concat
Теги:
group-concat

9 ответов

1177
Лучший ответ

Вы можете использовать GROUP_CONCAT.

Как в:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Death: Как сказал Даг в своем комментарии, ограничение по 1024 байт на результат. Чтобы решить эту проблему, запустите этот запрос перед запросом:

SET group_concat_max_len = 2048

Конечно, вы можете изменить 2048 в соответствии с вашими потребностями.

  • 138
    Просто учтите ограничение в 1024 байта в результирующем столбце (см. Параметр group_concat_max_len )
  • 71
    И добавив параметр DISTINCT , вы не получите никаких двойников. ... GROUP_CONCAT(DISTINCT hobbies)
Показать ещё 6 комментариев
61

Посмотрите GROUP_CONCAT, если ваша версия MySQL (4.1) поддерживает его. Подробнее см. документацию.

Он будет выглядеть примерно так:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
  • 10
    Я думаю, что group by 'all' не нужно (более того, нежелательно), потому что это назначает всем строкам строку all а затем сравнивает строки между этими строками. Я прав?
40

Альтернативный синтаксис для конкатенации нескольких отдельных строк

ПРЕДУПРЕЖДЕНИЕ: Этот пост сделает вас голодными.

Дано:

Я обнаружил, что хочу выбрать несколько отдельных строк - вместо группы - и объединить в определенное поле.

Скажем, у вас есть таблица идентификаторов продуктов и их имена и цены:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

Затем у вас есть ajax fancy-schmancy, который перечисляет эти щенки как флажки.

Ваш голодный бегемот выбирает 13, 15, 16. Сегодня ей не десерт...

Найти:

Способ суммирования вашего пользовательского порядка в одной строке с чистым mysql.

Решение:

Используйте GROUP_CONCAT с предложение IN:

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

Какие выходы:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

Бонусное решение:

Если вы хотите получить общую цену, перейдите в SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

PS: Извините, если у вас нет In-N-Out рядом...

  • 8
    Несмотря на то, что это хороший ответ, это больше похоже на рекламу, чем на чистый ответ. Все еще хороший форматированный ответ.
27

Вы можете изменить максимальную длину значения GROUP_CONCAT, установив параметр group_concat_max_len.

Подробнее см. Документация по MySQL.

21

Здесь есть функция GROUP Aggregate, GROUP_CONCAT.

13

В моем случае у меня была строка Ids, и было необходимо отправить ее на char, в противном случае результат был закодирован в двоичный формат:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
10

Использовать MySQL (5.6.13) переменную сеанса и оператор присваивания следующим образом

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

то вы можете получить

test1,test11
  • 0
    это быстрее чем GROUP_CONCAT?
  • 0
    Я проверил это в PHPMyAdmin с сервером MySQL v5.6.17 в столбце описания (varchar (50)) в тестовой таблице, но он возвращает поле BLOB для каждой записи: SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
6

У меня был более сложный запрос, и я обнаружил, что мне пришлось использовать GROUP_CONCAT во внешнем запросе, чтобы заставить его работать:

Исходный запрос:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

интегрировалась:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

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

3

Попробуйте следующее:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
  • 0
    Вот что я получил: «Нераспознанный тип оператора. (возле "ЗАЯВИТЬ" в позиции 0) '

Ещё вопросы

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