我有一个查询,我正在尝试构建一个视图。下面的查询按照我的预期工作,但它有一个子查询,所以mysql不会让我构建一个视图。我首先要说的是我对sql查询还是比较新的,所以当我尝试将它重构为没有子查询的查询时,我有点迷失。我在这里看到了一些Q / As,其中更有经验的用户帮助消除了这样的子查询,我希望有人能够为我提出一些建议。我也看到了做多个视图的建议,然后将它们组合在一起,但这对我来说感觉不太干净,如果有人能在这里看到消除子查询的方法,我宁愿不去做。关于消除子查询的一般建议会很棒,所以我可以更好地了解要查找的内容,以及对手头问题的更具体的答案。
(SELECT
`user_id`,`operations`.`name` AS `operation`,
`objectables`.`objectable_id` AS `objectable_id`,
`objectables`.`objectable_type` AS `objectable_type`,
sha2(concat(`operations`.`name`,
`objectables`.`objectable_type`,
`objectables`.`objectable_id`),
256) AS `access_hash`
FROM
(
(SELECT
`users`.`id` as `user_id`,
`ace_user`.`ace_id` as `ace_id`
FROM
`users`
LEFT JOIN `ace_user` ON ((`ace_user`.`user_id` = `users`.`id`))
)
UNION
(SELECT
`users`.`id` as `user_id`, `ace_id`
FROM (
((`users`
LEFT JOIN `role_user` ON ((`role_user`.`user_id` = `users`.`id`)))
LEFT JOIN `permission_role` ON ((`permission_role`.`role_id` = `role_user`.`role_id`)))
LEFT JOIN `ace_permission` ON ((`ace_permission`.`permission_id` = `permission_role`.`permission_id`))
)
)
) as `all_aces`
LEFT JOIN `aces` ON ((`aces`.`id` = `all_aces`.`ace_id`))
LEFT JOIN `operations` ON ((`operations`.`id` = `aces`.`operation_id`))
LEFT JOIN `objectables` ON ((`objectables`.`ace_id` = `all_aces`.`ace_id`)))
我为上面的查询稍微复杂一点而道歉。简而言之,我要做的是创建一个视图,总结用户拥有的所有访问权限。可以通过直接分配ACE(访问控制条目)或通过具有与其关联的某些权限的角色来授予用户访问权限,该角色链接到它们自己的ACE集。 ACE又与他们授予的权限相关联。我正在尝试创建一个显示所有这些的视图,以及对象,操作等的哈希,以便更快地进行hasAccess()检查。希望这有助于理解我上面的混乱查询。
提前感谢您的帮助! -Wally