как с помощью group_concat превратить строки таблицы в колонки mysql
Есть интересная функция, приведу пример:
create table users(
user_id int auto_incr,
name varchar(100),
pet_name varchar(50)
)
===========================================================
insert into users(name, pet_name) values
("Nastya", "dog"),
("Nastya", "parrot"),
("Dima", "cat");
===========================================================
select * from users;
+-------------------+
|name |pet_name |
+---------+---------+
|Nastya | dog |
+---------+---------+
|Nastya | parrot |
+---------+---------+
|Dima | cat |
+---------+---------+
===========================================================
select name, group_concat(pet_name) as pet_name
from users
group by name;
+----------------------+
|name |pet_name |
+---------+------------+
|Nastya | dog, parrot|
+---------+------------+
|Dima | cat |
+---------+------------+
как с ее помощью превратить каждую зверюшку в столбец?
тоесть, транспонировать таблицу, или то, чего нет в mysql - pivot.
Например, если бы я хотела посчитать количество питомцев у каждого юзера, и получить такую таблицу:
+-------------------------------+
|users |dog |cat |parrot |
+--------+------+------+--------+
|Nastya |1 |0 |1 |
+--------+------+------+--------+
|Dima |0 |1 |0 |
+--------+------+------+--------+
Как мне это сделать при условии, что я заранее не знаю количесто записей?
Ответы (1 шт):
Автор решения: Dmitrii Sedov
→ Ссылка
Можете попробовать вот так (как один из вариантов):
select name,
sum(CASE WHEN pet_name='dog' THEN 1 ELSE 0 END) AS dog,
sum(CASE WHEN pet_name='cat' THEN 1 ELSE 0 END) AS cat,
sum(CASE WHEN pet_name='parrot' THEN 1 ELSE 0 END) AS parrot,
from users
group by name;
Когда в имени встречаются определённые имена, то возвращаем 1, иначе 0. И в конце с помощью sum находим общее кол-во животных