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

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

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Мой Вывод:

shopping
fishing
coding

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

Ожидаемый Результат:

shopping, fishing, coding

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

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

9 ответов


можно использовать GROUP_CONCAT:

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

как Людвиг заявил в его комментария вы можете добавить DISTINCT оператор, чтобы избежать дублирования:

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

как Ян заявил в их комментария вы также можете сортировать значения перед его взрывом с помощью ORDER BY:

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

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

SET group_concat_max_len = 2048

конечно, вы можете изменить 2048 согласно вашим потребностям. Для вычисления и присвоения значения:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies GROUP BY person_id)
    AS UNSIGNED
)

посмотреть GROUP_CONCAT Если ваша версия MySQL (4.1) поддерживает его. См.документация для получения более подробной информации.

это будет выглядеть так:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

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

предупреждение: этот пост заставит вас голодать.

дано:

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

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

+------------+--------------------+-------+
| 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 |
+------------+--------------------+-------+

тогда у вас есть некоторые фантазии-schmancy ajax это перечисляет этих щенков как флажки.

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

найти:

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

устранение:

использовать GROUP_CONCAT С the 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 поблизости...


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


есть групповая Агрегатная функция,GROUP_CONCAT.


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

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

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

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

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

test1,test11

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

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


попробуйте это:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;