2015-11-17 119 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