Могу ли я объединить несколько строк MySQL в одно поле?
-
07-07-2019 - |
Вопрос
С использованием MySQL
, я могу сделать что-то вроде:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Мой результат:
shopping
fishing
coding
но вместо этого мне просто нужна 1 строка, 1 столбец:
Ожидаемый результат:
shopping, fishing, coding
Причина в том, что я выбираю несколько значений из нескольких таблиц, и после всех объединений у меня получается гораздо больше строк, чем хотелось бы.
Я искал функцию на Документ MySQL и это не похоже на CONCAT
или CONCAT_WS
функции принимают наборы результатов, так кто-нибудь здесь знает, как это сделать?
Решение
Вы можете использовать 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';
Альтернативный синтаксис для объединения нескольких отдельных строк
ПРЕДУПРЕЖДЕНИЕ. Это сообщение заставит вас голодать.
Дано:
Я обнаружил, что хочу выбрать несколько отдельных строк & # 8212; вместо группы & # 8212; и объединить в определенном поле.
Допустим, у вас есть таблица идентификаторов продуктов, их названий и цен:
+------------+--------------------+-------+
| 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 |
+------------------------------------------------+
Бонусное решение:
Если вам нужна общая цена, добавьте In-N-Out поблизости .. . р>
Вы можете изменить максимальную длину значения GROUP_CONCAT
, установив параметр group_concat_max_len
.
Подробнее см. в документации MySQL. . р>
Есть функция агрегирования GROUP, 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;
Для тех, кто ищет здесь, как использовать 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
должен использоваться внутри подзапроса, а не оборачивать его.
у нас есть два способа объединения столбцов в MySql
select concat(hobbies) as `Hobbies` from people_hobbies where 1
Или
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1