как с помощью 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 находим общее кол-во животных

→ Ссылка