0

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

所以。用户 3 可以访问房间 1,用户 2 可以访问房间等。在管理区域中,我想显示:我需要它

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

4

1 回答 1

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

但是如果您有未知数量的房间,那么您可以使用准备好的语句来创建动态版本

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

于 2012-08-28T13:08:59.470 回答