我有一个名为page
的表,代表我网站中的每一页。
page_id | page_subject | page_path
----------------------------------
1 | Foo | /Foo
2 | Bar | /Bar
我还有一个名为group
的表:
group_id | group_name
---------------------
1 | Users
2 | Admins
目标:如何定义单个组的每个页面的访问权限?
我确实创建了另一个表 - page_group
:
page_group | group_id
---------------------
1 | 1
1 | 2
表包含有权访问页面(page_group
)的组。
我写了函数:
CREATE FUNCTION `PAGE_ACCESS`(`pageId` INT, `groupId` MEDIUMINT)
BEGIN
RETURN IF((SELECT COUNT(*) FROM `page_group` WHERE page_id = pageId AND group_id = groupId) > TRUE, FALSE);
END;
现在我可以这样做:
SELECT *
FROM page
WHERE <conditions> AND PAGE_ACCESS(page_id, <group_id>)
...返回我应该有权访问的页面。
工作正常但似乎行速慢&gt; 100000 你会怎么做?你会以不同的方式做到这一点吗?
答案 0 :(得分:2)
尝试:
SELECT *
from Page p
WHERE EXISTS (SELECT 1 from page_group pg join group g
on (pg.group_id = g.groupidId)
WHERE g.group_id = <groupId>
AND p.page_id = pg.page_id)
你也可以尝试(只是意识到不需要组表):
SELECT *
from Page p
WHERE p.page_id IN (Select page_id
from page_group pg
WHERE pg.group_id = <group_id>)
甚至:
SELECT p.*
from Page p JOIN page_group pg ON (p.page_id = pg.page_id)
WHERE pg.group_id = <group_id>
答案 1 :(得分:0)
我会用EXPLAIN SELECT
测试查询的速度 - 我猜你没有表上的索引?另一种猜测:(page_group.page_group,page_group.group_id)
上的索引可能会加快速度。请参阅this introduction on EXPLAIN。
此外,请参阅@Michael Pakhantsov's answer with the subquery - 服务器优化子查询比UDF更容易。