从3个表格中获取数据并显示不错的表格

问题描述:

我有3个表格:用户,房间,room_access。 在用户是:user1,user2,user3 房间:room1 room2 roomN(我有大约10个房间) room_access(room,uid):room1,1; room2,1; roomN,1; room2,3; room1,3;从3个表格中获取数据并显示不错的表格

所以。 USER3访问房间1,用户2访问Roome来,等 在管理方面我想显示:i need that

主要是显示的表间的内容表头和表的用户内容显示表行。也许有办法,我可以选择单个查询中的所有数据?检查符号在哪里,我想放置复选框。所以。我不知道如何制作这张桌子。

+0

请证明您已经尝试过了 - 向我们展示您尝试过的mysql查询,以及一些(html?)标记您拥有alre ady得到了。请看[问]一个好问题。 – DaveP

+0

我什么也没试。因为我正在考虑如何从数据库中获取数据。如果是一个查询,我会很高兴。在浏览器中绘制表格没有问题。问题是 - 如何从数据库中获取数据... – Guntis

+0

[3个表的数据透视表]的可能重复(http://stackoverflow.com/questions/12986802/pivot-table-with-3-tables) – RichardTheKiwi

基本上,你试图通过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