2015-11-17 161 views
0

我正在尋找在單個視圖中跨表格總結查詢,但我堅持!下面的簡化版本:基於視圖或3表查詢的MySQL數據透視表

表1 users

usrID  usrName 
1   Adam 
2   Ben 
3   Charlie 

表2 groups

grpID  grpName 
A   Soccer 
B   Baseball 
C   Golf 

表3 users2groups

usrID  grpID  accessLevel 
1   A   a 
2   A   e 
2   C   v 
3   B   v 

這一點我想和總結:

usrName Soccer Baseball  Golf 
Adam  a   NULL   NULL 
Ben  e   NULL   c 
Charlie NULL  v   NULL 

我已經成功地創建一個查詢,將列出所有條目,並保存它作爲MySQL的觀點叫做permissions

SELECT users.usrName, groups.grpName, users2groups.accessLevel FROM ((`users` JOIN `groups`) LEFT JOIN `users2groups` ON (((`users2groups`.`usrID` = `users`.`usrID`) AND (`users2groups`.`grpID` = `groups`.`grpID`))))) 

從看這裏和其他地方,我發現一個透視表

SET @sql = NULL; 
SELECT 
GROUP_CONCAT(DISTINCT 
CONCAT(
    'MAX(IF(grpName = ''', 
    grpName, 
    ''', value, NULL)) AS ', 
    grpName 
) 
) INTO @sql 
FROM permissions; 
SET @sql = CONCAT('SELECT usrName, ', @sql, ' FROM permissions GROUP BY usrID'); 

但是當我嘗試在MySQL Workbench中運行該使用我的MySQL的看法,我得到Error Code: 1146. Table 'MYDB.permissions' doesn't exist:沿着線的功能。我試圖簡單地將"permissions"替換爲視圖基於上面的查詢(在括號中),但似乎沒有錯誤地運行,我沒有得到結果集顯示。

+0

您可以創建[SQL小提琴]爲例(http://sqlfiddle.com)?這會更容易看到有什麼問題 – Barranka

+0

這樣做嗎? http://sqlfiddle.com/#!9/fd8c3/3/0 – Adam

+0

你沒有把'permissions'表放到你的SQL小提琴中。你需要補充它嗎? – Barranka

回答

0

您的查詢正確構建,除了一些細節:

  1. 你忘記在你的視usrId場(你使用它在數據透視查詢,所以你需要把它)
  2. 這是什麼value字段,你把你的樞軸查詢?我想你的意思是accessLevel

除了那兩個小小的錯誤,我沒有看到其他問題。

當您執行此類操作時,最後一步是創建一個準備好的語句來運行存儲在@sql變量中的查詢。

下面我添加了修正後的腳本,它是連接到SQL小提琴(我用case ... end,而不是if()在樞軸查詢構造,但是這只是一個優先事項):

SQL Fiddle

的MySQL 5。5架構設置

CREATE TABLE users 
    (`usrID` int, `usrName` varchar(7)) 
; 

INSERT INTO users 
    (`usrID`, `usrName`) 
VALUES 
    (1, 'Adam'), 
    (2, 'Ben'), 
    (3, 'Charlie') 
; 


CREATE TABLE groups 
    (`grpID` varchar(1), `grpName` varchar(8)) 
; 

INSERT INTO groups 
    (`grpID`, `grpName`) 
VALUES 
    ('A', 'Soccer'), 
    ('B', 'Baseball'), 
    ('C', 'Golf') 
; 


CREATE TABLE users2groups 
    (`usrID` int, `grpID` varchar(1), `accessLevel` varchar(1)) 
; 

INSERT INTO users2groups 
    (`usrID`, `grpID`, `accessLevel`) 
VALUES 
    (1, 'A', 'a'), 
    (2, 'A', 'e'), 
    (2, 'C', 'v'), 
    (3, 'B', 'v') 
; 
CREATE 
    ALGORITHM = UNDEFINED 
    SQL SECURITY DEFINER 
VIEW `permissions` AS 
    (SELECT 
      `users`.`usrId` as `usrId` -- You forgot to include this column in the view (you use it in your pivot query) 
      , `users`.`usrName` AS `usrName` 
      , `groups`.`grpName` AS `grpName` 
      , `users2groups`.`accessLevel` AS `accessLevel` 
    FROM 
     ((`users` 
     JOIN `groups`) 
     LEFT JOIN `users2groups` ON (((`users2groups`.`usrID` = `users`.`usrID`) 
      AND (`users2groups`.`grpID` = `groups`.`grpID`)))) 
) 

查詢1

SET @sql = NULL 

Results:(無結果)

查詢2

SELECT GROUP_CONCAT(DISTINCT 
        CONCAT(
         'max(case grpName 
           when ''', grpName, ''' then accessLevel 
           else null 
          end) as `', grpName, '`' 
        ) 
        ) INTO @sql 
FROM permissions 

Results:(無結果)

查詢3

SET @sql = CONCAT('SELECT usrName, ', @sql, ' FROM permissions GROUP BY usrID') 

Results:(無結果)

查詢4

-- Prepare the statement 
prepare stmt from @sql 

Results:(無結果)

查詢5

-- Execute the statement 
execute stmt 

Results

| usrName | Soccer | Baseball | Golf | 
|---------|--------|----------|--------| 
| Adam |  a | (null) | (null) | 
|  Ben |  e | (null) |  v | 
| Charlie | (null) |  v | (null) | 

查詢6

-- When you're done, don't forget to deallocate the prepared statement 
deallocate prepare stmt 

Results:(無結果)

+0

根據你指出的錯誤一步一步的工作出。我的原始版本的查詢2沒有在''as grpName''中引用grpName,所以當grpName在其中有一個完整的(。)時(如果有人應該嘗試遵循這個),查詢就會中斷。隨着你的版本我開始運行。非常感謝幫忙。 – Adam

+0

@Adam樂於幫助。我已經發布了相當一些有關數據透視表在MySQL中的答案... [你可能想檢查出來](http://stackoverflow.com/search?q=user%3A355931+ [MySQL] +數據透視表) – Barranka