2012-08-28 66 views
0

我有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

回答

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

相關問題