Можно ли объединить несколько строк MySQL в одно поле?
Используя MySQL
, я могу сделать что-то вроде:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Мой вывод:
shopping
fishing
coding
но вместо этого я просто хочу 1 ряд, 1 столбец:
Ожидаемый результат:
shopping, fishing, coding
Причина в том, что я выбираю несколько значений из нескольких таблиц, и после всех объединений у меня намного больше строк, чем хотелось бы.
Я искал функцию в MySQL Doc, и похоже, что CONCAT
или CONCAT_WS
принимают наборы результатов, так кто-нибудь здесь знает, как это сделать?
Ответы
Ответ 1
Вы можете использовать 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
);
Ответ 2
Посмотрите GROUP_CONCAT
, если ваша версия MySQL (4.1) поддерживает его. Подробнее см. документацию.
Он будет выглядеть примерно так:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
Ответ 3
Альтернативный синтаксис для конкатенации нескольких отдельных строк
ПРЕДУПРЕЖДЕНИЕ: Этот пост сделает вас голодными.
Дано:
Я обнаружил, что хочу выбрать несколько отдельных строк - вместо группы - и объединить в определенное поле.
Скажем, у вас есть таблица идентификаторов продуктов и их имена и цены:
+------------+--------------------+-------+
| 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 рядом...
Ответ 4
Вы можете изменить максимальную длину значения GROUP_CONCAT
, установив параметр group_concat_max_len
.
Подробнее см. Документация по MySQL.
Ответ 5
Есть агрегатная функция GROUP, GROUP_CONCAT.
Ответ 6
В моем случае у меня была строка Ids, и было необходимо отправить ее на char, в противном случае результат был закодирован в двоичный формат:
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
Ответ 7
Использовать MySQL (5.6.13) переменную сеанса и оператор присваивания следующим образом
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
то вы можете получить
test1,test11
Ответ 8
У меня был более сложный запрос, и я обнаружил, что мне пришлось использовать 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;
Надеюсь, это может помочь кому-то.
Ответ 9
Попробуйте следующее:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
Ответ 10
у нас есть два способа объединить столбцы в MySql
select concat(hobbies) as 'Hobbies' from people_hobbies where 1
Или же
select group_concat(hobbies) as 'Hobbies' from people_hobbies where 1
Ответ 11
Для тех, кто ищет здесь, как использовать 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
должен использоваться внутри подзапроса, а не оборачивать его.