具有多个表的复杂MySQL查询(有关更多详细信息,请阅读)

具有多个表的复杂MySQL查询(有关更多详细信息,请阅读),mysql,multiple-tables,Mysql,Multiple Tables,我有4个表:团队、用户、用户团队和权限: PermissionsID | Name ------------------------------- 1 | Read Comments 2 | Write Comments 3 | Send Email 4 | Admin 用户: UserID | Name ------------------------ 1 | John 2 |

我有4个表:团队、用户、用户团队和权限:

PermissionsID | Name
-------------------------------
1             | Read Comments
2             | Write Comments
3             | Send Email
4             | Admin
用户:

UserID | Name
------------------------
1      | John
2      | Mike
3      | Tom
小组:

TeamID | Name
-------------------------------
1      | FC Barcelona
2      | Real Madrid
3      | Manchester United
4      | Liverpool
权限:

PermissionsID | Name
-------------------------------
1             | Read Comments
2             | Write Comments
3             | Send Email
4             | Admin
用户团队:

ID | UserID | TeamID | PermissionID
--------------------------------------------
1  | 1      | 1      | 1
2  | 1      | 1      | 2
3  | 1      | 1      | 4
4  | 1      | 2      | 1
4  | 1      | 4      | 3
- - UserID=1(我们在查询之前就知道这一点)

我想进行查询以获得如下内容:

Permission.Name | FC Barcelona | Real Madrid | Manchester United | Liverpool | etc...
----------------------------------------------------------------------------
Read Comments   | (something)  | (something) | NULL              | NULL
Write Comments  | (something)  | NULL        | NULL              | NULL
Send Email      | NULL         | NULL        | NULL              | (something)
Admin           | (something)  | NULL        | NULL              | NULL
Permission     | Team                |  User_name |  User_id
-----------------------------------------------------------------
Read Comments  | FC Barcelona        | John       | 1
Write Comments | Real Madrid         | John       | 1
Send Email     | Manchester United   | Mike       | 2
Admin          | ...(unlimited)      | Tom        | 2
团队的数量不受限制

有什么想法吗?我不介意有多个问题

提前谢谢

解决方案

仅限首批选定团队:

SELECT TeamID, name FROM Teams
然后使用团队数据创建一个新查询:

SELECT     
Permissions.name as 'permissionName', 

<Loop this line with the previous query>
    MAX(CASE WHEN Teams.name = 'FC Barcelona' THEN Teams.name ELSE NULL END) AS 'FC Barcelona'
<End loop>

FROM Permissions
LEFT JOIN UserTeams ON UserTeams.PermissionID = Permissions.PermissionID AND UserTeams.UserID = '1' 
LEFT JOIN Teams ON Teams.TeamID = UserTeams.TeamID   
GROUP BY Permissions.name  
选择
Permissions.name作为“permissionName”,
最大值(当Teams.name='FC Barcelona'然后Teams.name ELSE为NULL END时为'FC Barcelona'
来自权限
在UserTeams.PermissionID=Permissions.PermissionID和UserTeams.UserID='1'上左键加入UserTeams
左加入Teams.TeamID=UserTeams.TeamID上的团队
按权限分组。名称

现在我们得到了我们想要的结果。

我认为你们的表格不完整。。其中将存储“(something)”

查询结果中的列数不是可变的,您将始终获得相同的列数。因此,我建议使用如下查询结果:

Permission.Name | FC Barcelona | Real Madrid | Manchester United | Liverpool | etc...
----------------------------------------------------------------------------
Read Comments   | (something)  | (something) | NULL              | NULL
Write Comments  | (something)  | NULL        | NULL              | NULL
Send Email      | NULL         | NULL        | NULL              | (something)
Admin           | (something)  | NULL        | NULL              | NULL
Permission     | Team                |  User_name |  User_id
-----------------------------------------------------------------
Read Comments  | FC Barcelona        | John       | 1
Write Comments | Real Madrid         | John       | 1
Send Email     | Manchester United   | Mike       | 2
Admin          | ...(unlimited)      | Tom        | 2
(当然有正确的值;))

对此的SQL查询将是:

SELECT 
    p.Name AS Permission,
    u.Name AS User_name,
    t.Name AS Team,
    u.id AS User_id
FROM
    UserTeams AS ut
INNER JOIN
    Users AS u ON (ut.UserId = u.UserId)
INNER JOIN
    Teams AS t ON (ut.TeamId = t.TeamId)
INNER JOIN
    Permissions AS p ON (ut.PermissionId = p.PermissionsId)
WHERE
    u.UserID = :userId

阅读数据透视表:数据透视表的问题是使这些数据透视表成为动态的……如果对行/列有权限,(something)值可以是任何值。如果没有权限,则行/列为空。。。如果我需要为所选用户(UserID=1)获取每个团队的权限列表,这会有什么帮助?
permissions=array()
foreach($result as$row){
`permissions[$row['user\u id'][$row['team'][$row['Permission']]=$row['Permission'];
}
现在您有了一个数组,可以用foreach进行迭代了。。。这是最好的解决方案,因为您只需要一个查询