Используя MySQL
, я могу сделать что-то вроде:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Мой результат:
shopping
fishing
coding
но вместо этого я хочу только 1 строку, 1 столбец:
Ожидаемый результат:
shopping, fishing, coding
Причина в том, что я выбираю несколько значений из нескольких таблиц, и после всех объединений у меня получается гораздо больше строк, чем мне хотелось бы.
Я'искал функцию на <a href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws">- MySQL Doc и не похоже, что функции 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;
Как указал Dag в его комментарии, существует ограничение на результат в 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 |
+------------+--------------------+-------+
Тогда у вас будет супер-пупер AJAX, которые перечислены эти щенки, как флажки.
Голодных-бегемот пользователь выбирает 13, 15, 16
. Нет десерт для нее сегодня...
Способ обобщения пользователя's порядок в одну линию, с чисто в MySQL.
Решение##:
Использовать GROUP_CONCAT С "В" пункта:
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 |
+------------------------------------------------+
Если вы тоже хотите общая цена, бросить в сумма()
:
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 |
+------------------------------------------------+-------+
ЗЫ: извиняюсь, если вы не'т иметь в-н-из рядом...
Вы можете изменить максимальную длину значения GROUP_CONCAT, установив параметр
group_concat_max_len`.
Подробности см. в документацию по MySQL.
В моем случае у меня был ряд идентификаторов, и это было необходимо для приведения его в 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 с подзапросом - проводки в данном примере
Выберите я.*, (Выберите GROUP_CONCAT(ID пользователя) из избранное F, где F.идентификатор Itemid = я.ID) как idlist Из предметов я Где я.идентификатор = $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