我有3个表:用户,房间,room_access。
用户中的用户是:user1,user2,user3
在房间里:room1 room2 roomN(我大约有10个房间)
room_access(房间,uid):room1、1; room2,1; N,1室; room2,3;房间1,3;

所以。用户3可以访问room1,用户2可以访问roome,依此类推。
在管理区域中,我想显示以下内容:

基本上,会议室内容显示在表标题中,而表用户内容显示在表行中。也许有一种方法可以在单个查询中选择所有数据?复选符号在哪里,我要在其中放置复选框。所以。我不知道怎么做那张桌子。

最佳答案

本质上,您正在尝试通过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


SQL Fiddle with Demo

但是,如果房间数未知,则可以使用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;


SQL Fiddle with Demo

09-30 15:28
查看更多