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