【发布时间】:2014-07-10 17:55:54
【问题描述】:
我正在构建一个小型权限系统,但不幸的是,无论如何我都不是 SQL 专家。
在这个系统中,我决定给所有用户一个角色,然后为这些角色分配特定的权限。我当前的数据库表如下所示:
我的问题是:通过提供 Permission.permission_name 值来检查给定的 User.id 是否作为权限的最佳方法是什么。我想出了以下查询:
SELECT EXISTS (
SELECT perm.id
FROM `User` userr
INNER JOIN `Role_Permission` connectionc
ON userr.role_id = connectionc.role_id
INNER JOIN `Permission` perm
ON connectionc.permission_id = perm.id
WHERE userr.id = 1
AND perm.permission_name LIKE 'doStuff'
) as userHasPermission
它可以工作,但是,据我了解,加入是昂贵的,并且该查询正在加入 3 个表的内容,然后过滤它需要的内容。
sqlfiddle 链接:http://sqlfiddle.com/#!2/6ed7b/1
谢谢。
【问题讨论】:
-
有点混乱“INNER JOIN
Rolerole ON userr.id = role.id”。那不应该是“INNER JOINRolerole ON userr.role_id = role.id”。 IMO 我看不出有什么理由需要加入“角色”。 -
@JA 你是对的。 ;) 刚刚编辑。
-
SQL 似乎是正确的。请您发起/提供一个 sqlfiddle.com 吗?
-
@JA sqlfiddle.com/#!2/6ed7b/1 ,是的,代码是正确的,我在另一个地方误读了一些东西。原来的问题仍然存在。我可以优化谁的查询?谢谢。
标签: mysql sql query-optimization inner-join