【问题标题】:Get data from 3 tables and show nice table从 3 个表中获取数据并显示漂亮的表
【发布时间】:2012-08-28 12:30:29
【问题描述】:

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

所以。 User3 可以访问 room1,user2 可以访问 roome,等等。 在管理区域我想显示:

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

【问题讨论】:

  • 请展示您已经尝试过的内容 - 向我们展示您尝试过的 mysql 查询,以及您已经获得的一些(html?)标记。请参阅How to Ask 一个好问题。
  • 我什么都没试过。因为我正在考虑如何从数据库中获取数据。如果这是一个查询,我会很高兴。浏览器中的绘图表没有问题。问题是 - 如何从数据库中获取数据...
  • Pivot Table With 3 tables的可能重复

标签: mysql sql pivot


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多