MySQL does not support PIVOT relational operator. But surely there is way to pivot data in MySQL. The challenge in your data was non uniqueness of pivot columns. There would be multiple columns with name "2" in your output.
So I have created uniqueness by concatenating team last three later of name field. I am sharing here both static and dynamic pivoting for your data. In dynamic pivot it would not matter if you have three players or ten it will deliver your data in your required format. But if your team list is fixed along with player list then you can go for static pivot since it will be faster.
In dynamic pivot I have created your data as table t
. You can put your entire select query in place of t
.
Schema:
create table t (team int, name varchar(50) ,rank int);
insert into t values(1, '1Player1', 1);
insert into t values(1, '1Player2', 2);
insert into t values(1, '1Player3', 2);
insert into t values(1, '1Player4', 2);
insert into t values(1, '1Player5', 3);
insert into t values(1, '1Player6', 4);
insert into t values(1, '1Player7', 5);
insert into t values(2, '2Player1', 1);
insert into t values(2, '2Player2', 2);
insert into t values(2, '2Player3', 2);
insert into t values(2, '2Player4', 2);
Query#1 (static pivot)
SELECT team, MAX(IF(concat(rank,right(name,3)) = '1er1', concat(rank,name), NULL)) AS "1",
MAX(IF(concat(rank,right(name,3)) = '2er2', concat(rank,name), NULL)) AS "2",
MAX(IF(concat(rank,right(name,3)) = '2er3', concat(rank,name), NULL)) AS "2",
MAX(IF(concat(rank,right(name,3)) = '2er4', concat(rank,name), NULL)) AS "2",
MAX(IF(concat(rank,right(name,3)) = '3er5', concat(rank,name), NULL)) AS "3",
MAX(IF(concat(rank,right(name,3)) = '4er6', concat(rank,name), NULL)) AS "4",
MAX(IF(concat(rank,right(name,3)) = '5er7', concat(rank,name), NULL)) AS "5"
FROM (SELECT tm.team_id AS team, pp.user_name AS name, tm.rank AS rank
FROM teams_members AS tm
LEFT JOIN players_profiles AS pp
ON pp.uid=tm.user_id
WHERE tm.team_id = 1 OR tm.team_id = 2
ORDER BY tm.team_id, tm.rank)t
GROUP BY team
Query#2 (dynamic pivot)
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(concat(rank,right(name,3)) = ''',
concat(rank,right(name,3)),
''', concat(rank,name), NULL)) AS ',
concat('"',rank,'"')
)
) INTO @sql
FROM t;
SET @sql = CONCAT('SELECT team
, ', @sql, '
FROM t
GROUP BY team');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Output:
team |
1 |
2 |
2 |
2 |
3 |
4 |
5 |
1 |
11Player1 |
21Player2 |
21Player3 |
21Player4 |
31Player5 |
41Player6 |
51Player7 |
2 |
12Player1 |
22Player2 |
22Player3 |
22Player4 |
null |
null |
null |
db<>fiddle here