从3个表中获取数据并显示漂亮的表格

时间:2012-08-28 12:30:29

标签: mysql sql pivot

我有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等。 在管理区域中,我想显示:i need that

桌面房间内容基本上是显示表格标题,表格用户内容显示表格行。也许有办法我可以在单个查询中选择所有数据?检查符号在哪里,我想要放置复选框。所以。我不知道如何制作那张桌子。

1 个答案:

答案 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

请参阅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