我有3个表:用户,房间,room_access。 在用户中是:user1,user2,user3 在房间:room1 room2 roomN(我有大约10个房间) room_access(room,uid):room1,1; room2,1; roomN,1; room2,3; room1,3;
因此。 User3可以访问room1,user2可以访问roome等。 在管理区域中,我想显示:
桌面房间内容基本上是显示表格标题,表格用户内容显示表格行。也许有办法我可以在单个查询中选择所有数据?检查符号在哪里,我想要放置复选框。所以。我不知道如何制作那张桌子。
答案 0 :(得分:2)
基本上,您正尝试通过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
但是如果您的房间数量不详,那么您可以使用prepared statement to create a dynamic version
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;