Используя MySQL
, я могу сделать что-то вроде:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
и получим:
shopping
fishing
coding
но вместо этого я просто хочу 1 строку, 1 col:
shopping, fishing, coding
Причина в том, что я выбираю несколько значений из нескольких таблиц, и после всех объединений у меня есть намного больше строк, чем хотелось бы.
Я искал функцию MySQL Doc и не похож на результат приема CONCAT
или CONCAT_WS
устанавливает, так кто-нибудь здесь знает, как это сделать?
Вы можете использовать GROUP_CONCAT.
Как в:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id
Death: Как сказал Даг в своем комментарии, ограничение по 1024 байт на результат. Чтобы решить эту проблему, запустите этот запрос перед запросом:
SET group_concat_max_len = 2048
Конечно, вы можете изменить 2048
в соответствии с вашими потребностями.
DISTINCT
, вы не получите никаких двойников. ... GROUP_CONCAT(DISTINCT hobbies)
Посмотрите GROUP_CONCAT
, если ваша версия MySQL (4.1) поддерживает его. Подробнее см. документацию.
Он будет выглядеть примерно так:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
group by 'all'
не нужно (более того, нежелательно), потому что это назначает всем строкам строку 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 fancy-schmancy, который перечисляет эти щенки как флажки.
Ваш голодный бегемот выбирает 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 |
+------------------------------------------------+-------+
PS: Извините, если у вас нет In-N-Out рядом...
Вы можете изменить максимальную длину значения GROUP_CONCAT
, установив параметр group_concat_max_len
.
Подробнее см. Документация по MySQL.
Здесь есть функция GROUP Aggregate, GROUP_CONCAT.
В моем случае у меня была строка Ids, и было необходимо отправить ее на 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
SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
У меня был более сложный запрос, и я обнаружил, что мне пришлось использовать 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;