0

私は3つのテーブルを持っています:users、rooms、room_access。ユーザーの場合:user1、user2、user3の部屋の場合:room1 room2 roomN(約10個の部屋があります)room_access(room、uid):room1、1; room2,1; roomN、1; 部屋2,3; room1,3;

それで。User3はroom1にアクセスでき、user2はroomeなどにアクセスできます。管理エリアで次のことを表示します。わたしはそれが必要

基本的に、テーブルルームのコンテンツはテーブルヘッダーに表示され、テーブルユーザーのコンテンツはテーブル行に表示されます。たぶん、1つのクエリですべてのデータを選択できる方法はありますか?そして、チェック記号はどこにありますか、そこにチェックボックスを配置したいと思います。それで。そのテーブルの作り方がわかりません。

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 FiddlewithDemoを参照してください

ただし、部屋の数が不明な場合は、プリペアドステートメントを使用して動的バージョンを作成できます

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 FiddlewithDemoを参照してください

于 2012-08-28T13:08:59.470 に答える