基于视图或3表查询的MySQL pivot

基于视图或3表查询的MySQL pivot,mysql,pivot-table,Mysql,Pivot Table,我想在一个视图中总结跨表的查询,但我被卡住了!简化版本如下: 表1用户: 表2群体: 表3用户组: 我想总结一下: usrName Soccer Baseball Golf Adam a NULL NULL Ben e NULL c Charlie NULL v NULL 我已经创建了一个查询,该查询将列出所有条目,并将其保存为名为permissi

我想在一个视图中总结跨表的查询,但我被卡住了!简化版本如下:

表1用户:

表2群体:

表3用户组:

我想总结一下:

usrName    Soccer    Baseball     Golf
Adam       a         NULL         NULL
Ben        e         NULL         c
Charlie    NULL      v            NULL
我已经创建了一个查询,该查询将列出所有条目,并将其保存为名为permissions的MySQL视图:

通过查看这里和其他地方,我发现了一个pivot表函数:

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工作台中使用我的MySQL视图来运行它时,我得到了错误代码:1146。表“MYDB.permissions”不存在。我尝试简单地用括号中视图基于的查询替换权限,但虽然它似乎运行时没有错误,但我没有显示结果集。

您的查询构建正确,除了一些详细信息:

您忘了在视图中包含usrId字段,因为您在pivot查询中使用了它,所以您需要将其放入视图中 在pivot查询中输入的值字段是什么?我想你指的是水平。 除了这两个小错误,我看不出还有其他问题

执行此类操作的最后一步是创建一个准备好的语句来运行存储在@sql变量中的查询

下面我添加了修改后的脚本,它链接到SQLFIDLE我的用例。。。在pivot查询构造中,使用end而不是if,但这只是首选项:

MySQL 5.5架构设置:

创建表用户 `usrID`int,`usrName`varchar7 ; 插入到用户中 `usrID`,`usrName` 价值观 1“亚当”, 2“本”, 3,“查理” ; 创建表组 `grpID`varchar1,`grpName`varchar8 ; 分组 `grpID`,`grpName` 价值观 "A","足球",, “B”,“棒球”, “C”,“高尔夫” ; 创建表users2groups `usrID`int,`grpID`varchar1,`accessLevel`varchar1 ; 插入到用户组中 `usrID`、`grpID`、`accessLevel` 价值观 1、‘A’、‘A’, 2、‘A’、‘e’, 2、‘C’、‘v’, 3,“B”,“v” ; 创造 算法=未定义 SQL安全定义程序 将“权限”视为 选择 `用户“.`usrId`作为`usrId`-您忘记在透视查询中使用此列的视图中包含此列 ,'users`.'usrName`作为'usrName'` ,`groups`.`grpName`AS`grpName`` ,`users2groups`.`accessLevel`作为`accessLevel`` 从…起 `使用者` 加入`团体` 在users2groups上左键加入users2groups.`usrID`=`users`.`usrID`` 和`users2groups`.`grpID`=`groups`.`grpID`` 问题1:

设置@sql=NULL :没有结果

问题2:

选择组\u CONCATDISTINCT 海螺 “maxcase grpName 当'grpName'时,然后是accessLevel 否则无效 以“`”结尾,grpName“`” 进入@sql 来自权限 :没有结果

问题3:

设置@sql=CONCAT'SELECT usrName',@sql'FROM permissions GROUP BY usrID' :没有结果

问题4:

-准备声明 从@sql准备stmt :没有结果

问题5:

-执行该语句 执行stmt :

|乌斯纳姆|足球|棒球|高尔夫| |-----|----|-----|----| |亚当|一|零|零| |Ben | e | null | v| |查理|零| v |零| 问题6:

-完成后,不要忘记取消分配准备好的语句 解除分配准备stmt
:无结果

您可以创建一个示例吗?这样更容易看出什么是错误的,这样做有什么用?您没有将权限表放在SQL FIDLE中。你能添加它吗?我已经把permissions视图放到了fiddle中,但似乎不能把上面的查询起始集@sql=NULL放到fiddle中,并让它保持刷新/共享状态,因为这是错误的部分?请粘贴到更新的sql fiddle的链接,并根据你指出的错误一步一步地完成它。我最初版本的查询2没有将中的grpName引用为grpName,因此当grpName有一个句号时,查询中断。以防任何人都应该遵循这一点。有了你的版本,我就可以开始运行了。非常感谢你的帮助。@Adam很乐意帮忙。我已经发布了很多关于MySQL中pivot表的答案。。。
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
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');