从mysql视图中消除子查询

时间:2014-06-12 15:13:16

标签: mysql view

我有一个查询,我正在尝试构建一个视图。下面的查询按照我的预期工作,但它有一个子查询,所以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

0 个答案:

没有答案