基于视图或3表查询的MySQL pivot
我想在一个视图中总结跨表的查询,但我被卡住了!简化版本如下: 表1用户: 表2群体: 表3用户组: 我想总结一下:基于视图或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
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');