Используя MySQL, я могу сделать что-то вроде:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Мой результат:
shopping
fishing
coding
но вместо этого мне просто нужна 1 строка, 1 столбец:
Ожидаемый результат:
shopping, fishing, coding
Причина в том, что я выбираю несколько значений из нескольких таблиц, и после всех объединений у меня гораздо больше строк, чем хотелось бы.
Я искал функцию на Документ MySQL, и не похоже, что функции CONCAT или CONCAT_WS принимают наборы результатов.
Так кто-нибудь здесь знает, как это сделать?
это может вам помочь w3resource.com/mysql/aggregate-functions-and-grouping/…






Вы можете использовать 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);
Просто имейте в виду ограничение в 1024 байта в результирующем столбце (см. Параметр group_concat_max_len)
А добавив параметр DISTINCT, дублей не получишь. ... GROUP_CONCAT(DISTINCT hobbies)
Мне нужно было получить ВСЕ данные из одного столбца. Не используйте для этого предложение GROUP BY. Пример: SELECT GROUP_CONCAT (электронная почта SEPARATOR ',') ОТ пользователей;
Если вы хотите отсортировать хобби в получившейся взорванной строке, используйте: SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
GROUP_CONCAT также существует в SQLite и сделал мне день! Итак, +1!
Если вы попытаетесь использовать group_concat в строке с одним столбцом NULL, вся строка будет исключена из group_concat. Смотрите второй нюанс здесь.
Если им просто нужен список, нужно ли вообще выбирать и группировать person_id?
Group_concat может достигнуть предела. Есть ли другой путь?
Есть функция агрегирования GROUP, GROUP_CONCAT.
Взгляните на GROUP_CONCAT, если ваша версия MySQL (4.1) поддерживает его. Подробнее см. документация.
Это выглядело бы примерно так:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
Я думаю, что group by 'all' не нужен (тем более нежелателен), потому что он присваивает всем строкам строку all, а затем сравнивает строки между этими строками. Я прав?
Я полагаю, вы можете просто использовать выражение «GROUP BY NULL» ???
Вы можете изменить максимальную длину значения GROUP_CONCAT, установив параметр group_concat_max_len.
Подробности см. В Документация MySQL.
Используйте переменную сеанса MySQL (5.6.13) и оператор присваивания, как показано ниже
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
тогда вы можете получить
test1,test11
это быстрее, чем GROUP_CONCAT?
Я тестировал это в PHPMyAdmin с сервером MySQL v5.6.17 в столбце описание (varchar (50)) в таблице тестовое задание, но он возвращает поле BLOB для каждой записи: SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
В моем случае у меня была строка идентификаторов, и необходимо было преобразовать ее в char, иначе результат был закодирован в двоичный формат:
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
ВНИМАНИЕ: этот пост вызовет у вас чувство голода.
Я обнаружил, что хочу выбрать несколько отдельных строк - вместо группы - и объединить в определенное поле.
Допустим, у вас есть таблица идентификаторов продуктов, их названий и цен:
+------------+--------------------+-------+
| 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. Сегодня ей нет десерта ...
Способ суммировать порядок вашего пользователя в одной строке с помощью чистого 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 |
+------------------------------------------------+-------+
Хотя это хороший ответ, это больше похоже на рекламу, чем на простой ответ. Тем не менее, хороший хорошо сформулированный ответ.
Попробуй это:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
TL; DR;
set @sql='';
set @result='';
set @separator=' union \r\n';
SELECT
@sql:=concat('select ''',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME ,''' as col_name,',
INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH ,' as def_len ,' ,
'MAX(CHAR_LENGTH(',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME , '))as max_char_len',
' FROM ',
INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
) as sql_piece, if (@result:=if (@result='',@sql,concat(@result,@separator,@sql)),'','') as dummy
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
INFORMATION_SCHEMA.COLUMNS.DATA_TYPE like '%char%'
and INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA='xxx'
and INFORMATION_SCHEMA.COLUMNS.TABLE_NAME='yyy';
select @result;
Вот что я получил: «Нераспознанный тип оператора. (рядом с "DECLARE" в позиции 0) '
У меня был более сложный запрос, и я обнаружил, что мне пришлось использовать 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;
Надеюсь, это может кому-то помочь.
у нас есть два способа объединить столбцы в MySql
select concat(hobbies) as `Hobbies` from people_hobbies where 1
Или же
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
Для тех, кто ищет здесь, как использовать 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 нужно использовать внутри подзапроса, а не обертывать его.
Я только что написал небольшую демонстрацию того, как использовать group_concat, которая может быть вам полезна: giombetti.com/2013/06/06/mysql-group_concat