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

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

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Мой вывод:

shopping
fishing
coding

но вместо этого я просто хочу 1 ряд, 1 столбец:

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

shopping, fishing, coding

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

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

Так кто-нибудь здесь знает, как это сделать?

10.11.2008 02:34:26
Я только что написал небольшую демонстрацию о том, как использовать group_concat, которая может быть вам полезна: giombetti.com/2013/06/06/mysql-group_concat
Marc Giombetti 6.06.2013 18:26:46
11 ОТВЕТОВ
РЕШЕНИЕ

Вы можете использовать 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
);
1719
26.10.2018 16:41:32
Просто помните об ограничении 1024 байта в результирующем столбце (см. Параметр group_concat_max_len )
Dag 28.03.2012 10:09:30
И добавив DISTINCTпараметр, вы не получите никаких двойников. ... GROUP_CONCAT(DISTINCT hobbies)
Ludwig 18.06.2012 14:39:35
Мне нужно было получить ВСЕ данные из одного столбца. Не используйте для этого предложение GROUP BY. Пример: SELECT GROUP_CONCAT (электронная почта SEPARATOR ',') ОТ пользователей;
Jonathan Bergeron 17.01.2014 14:04:22
Спасибо, я не знал, что существует ограничение длины группового конкурса. Мне нужно было это, чтобы обойти список монстров, который я создал.
Patrick 25.03.2016 14:54:21
Если вы хотите отсортировать хобби в результате интегрировались использование строки:SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Jan 8.03.2017 15:38:37

Есть агрегатная функция GROUP, GROUP_CONCAT .

28
27.06.2016 23:03:11

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

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

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
105
1.09.2017 08:13:19
Я думаю, что group by 'all'это не обязательно (более того, нежелательно), потому что это назначить для всех строк строки, allа затем сравнить строки между этими строками. Я прав?
Krzysiek 19.10.2014 18:43:39

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

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

39
27.09.2013 14:25:08

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

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

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

test1,test11
15
27.09.2013 18:47:25
это быстрее чем GROUP_CONCAT?
jave.web 6.02.2014 18:39:23
Я проверил это под PHPMyAdmin с сервером MySQL v5.6.17 на описание столбца (VARCHAR (50)) в тестовой таблице , но она возвращает поле BLOB для каждой записи:SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Jan 8.03.2017 15:31:43

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

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
25
10.06.2014 09:24:31
Спасибо! Без CASTменя были значения, как [BLOB - 14 Bytes]в результате!
Mel_T 7.02.2020 15:14:08
Могу ли я получить помощь stackoverflow.com/q/60278898/11697039 @Fedir RYKHTIK
zus 18.02.2020 11:00:31

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

ВНИМАНИЕ: этот пост сделает вас голодным.

Данный:

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

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

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

Тогда у вас есть какой-нибудь необычный аякс, который перечисляет этих щенков как флажки.

Ваш голодный пользователь бегемота выбирает 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 поблизости ...

74
7.10.2015 17:39:54
Хотя это хороший ответ, это больше похоже на рекламу, чем на чистый ответ. Все еще хороший, хорошо сформированный ответ.
FliiFe 15.11.2016 17:55:23
Могу ли я получить помощь stackoverflow.com/q/60278898/11697039 @elbowlobstercowstand
zus 18.02.2020 11:00:06

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

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
7
18.01.2017 03:37:56
Вот что я получил: «Нераспознанный тип оператора. (около "ЗАЯВИТЬ" в позиции 0) '
Istiaque Ahmed 7.11.2017 17:58:30

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

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

14
29.04.2015 16:35:34

у нас есть два способа объединить столбцы в MySql

select concat(hobbies) as `Hobbies` from people_hobbies where 1

Или

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
1
13.11.2018 13:37:54

Для тех, кто ищет здесь, как использовать GROUP_CONCATс подзапросом - опубликовать этот пример

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

Так что GROUP_CONCATнужно использовать внутри подзапроса, а не оборачивать его.

9
26.04.2019 09:26:01
Это было именно то , что я искал
bumerang 6.06.2019 10:12:38