基本的に、を介してデータを返そうとしていますPIVOT
。MySQLにはPIVOT
関数がないため、集計関数とCASE
ステートメントを組み合わせて使用できます。使用できる部屋の数が事前にわかっている場合は、次のようにします。
select u.uname,
max(case when r.rname = 'room 1' then 'y' else 'n' end) room1,
max(case when r.rname = 'room 2' then 'y' else 'n' end) room2,
max(case when r.rname = 'room 3' then 'y' else 'n' end) room3
from users u
left join room_access ra
on u.uid = ra.userid
left join rooms r
on ra.roomid = r.rid
group by u.uname
ただし、部屋の数が不明な場合は、プリペアドステートメントを使用して動的バージョンを作成できます
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN rname = ''',
rname,
''' THEN ''Y'' ELSE ''N'' END) AS ',
replace(rname, ' ', '')
)
) INTO @sql
FROM rooms;
SET @sql = CONCAT('SELECT u.uname, ', @sql, '
from users u
left join room_access ra
on u.uid = ra.userid
left join rooms r
on ra.roomid = r.rid
group by u.uname');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;