Могу ли я объединить несколько строк 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 поблизости...
в моем случае у меня была строка идентификаторов, и было необходимо привести ее к 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;