我已经做了大量的阅读和测试,并且可以从单个查询中获取所需的信息,但是我似乎无法将它们合并到一个表中。

目标-列出所有带有相关块的容器以及AdminRole的名称。

这是我需要的表和字段之间的关系的直观视图:
Table Structure Picture

由于我还无法附加图片,因此以下是表格说明:


管理员权限

adminID(= adminrole_admin.adminID)(编辑:= adminrole.ID)
objectID(= Container.ID)
ObjectType(条件“容器”)

adminrole_admin(编辑:不需要表)

adminroleID(= adminrole.ID)
adminID(= AdminACL.adminID)

管理员

ID(= adminrole_admin.adminroleID)(编辑:= AdminACL.adminid)
名称
容器

ID(= AdminACL.objectID)
名称
container_block

containerID(= Container.ID)
blockID(= Block.ID)



ID(= container_block.blockID)
名称


我为每个片段都提供了选择语句,但是由于它会导致异常混乱的查询,因此我尝试了联接,但最终得到了空集。我不确定从哪张表开始,是否需要使用不同类型的联接和/或顺序不同。

这是我放弃之前尝试的最后一个查询:

SELECT C.name, B.name, A.name
FROM container C
JOIN (SELECT adminid,objected from adminacl where objecttype='Container') ACL ON ACL.objectid=C.id
JOIN adminrole_admin AA ON ACL.adminid=AA.adminid
JOIN (select id,name from adminrole where name not like 'hidden_%') A ON AA.adminid=A.id
JOIN container_block CB ON C.id=CB.containerid
JOIN block B ON CB.blockid=B.id;


尽管我很喜欢答案,但我也想了解将来如何构造这种类型的查询。我很确定我缺少明显的东西-很难将与此相关的所有其他例子联系起来。 TIA!

编辑:事实证明adminacl.adminid = adminrole.id,这使事情变得更加简单。最后还需要“隐藏”管理员角色,这是在角色之上添加的基于特定用户的权限。根据拉斯的回答,这就是我最终的查询结果:

SELECT container.name, block.name, adminrole.name
FROM block
    LEFT JOIN container_block ON container_block.blockid=block.id
    LEFT JOIN container ON container.id=container_block.containerid
    LEFT JOIN adminacl ON adminacl.objectid=container.id
    JOIN adminrole ON adminrole.id=adminacl.adminid
WHERE
    adminacl.objecttype='Container'
    AND block.blockstatus !=1 #to exclude unassigned blocks
ORDER BY container.name, block.name;

最佳答案

我喜欢从我真正想要的最大数量开始。从您的问题来看,我认为您希望在其中具有容器和管理员角色的块列表,因此我从那里开始,并在其他信息的左侧加入以创建列表。

SELECT Block.name, Container.name, adminrole.name from
Block
    LEFT JOIN container_block ON container_block.containerid = Block.id
    LEFT JOIN Container ON Container.id = container_block.containerid
    LEFT JOIN AdminACL ON AdminACL.objectid = Container.id
    RIGHT JOIN adminrole_admin ON adminrole_admin.adminid #there could be multiple roles
    LEFT JOIN adminrole ON adminrole.id = adminrole_admin.adminroleID
WHERE
    AdminACL.ObjectType = "Container"
    AND adminrole.name  not like 'hidden_%';
# shouldn't you have a `hidden` column on the table, instead of prefixing the name?


免责声明:我是从内存中写出来的,甚至都没有对它进行任何测试,但是尝试一下,它可能会使您走上正确的道路。

LEFT JOIN将排除不符合联接条件的行,因此您不应出现许多不相关的空格,但我假设可以有许多管理员,因此我使用RIGHT JOIN来产生包含所有内容的行adminroleBlock的可能组合。这意味着同一块出现不同的管理员,而同一块管理员出现在多个块。您的应用程序将需要适当地处理此重复。

关于mysql - 连接多个(超过3个)表的顺序如何以及在何处放置条件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25893713/

10-09 01:48