I was wondering if someone could tell me what things I might need to do to make this query as fast as possible.

I am developing a web site where users will have access to certain things based on what groups they are in and what groups have access to certain things. There are several different types things they have access to based on the group but for this discussion lets limit it to pages. For a user to view a page they have to be associated with one or more of the groups that the page is linked to. Since the relation ship between pages to groups and users to groups is many to many I have a table just for that relationship. So here are my tables
Group:
 contains various info about the group with key field GroupID.
User:
 contains various info about the user along with the key field UserID.
Page:
 contains various info about a page on the site along with it's PageID.

GroupLink:
CREATE TABLE  `grouplink` (
`LinkType` set('user','page','template','templatefile','menu') NOT NULL default '',
 `ID` int(10) unsigned NOT NULL default '0',
 `GroupID` int(10) unsigned NOT NULL default '0',
 PRIMARY KEY  (`LinkType`,`ID`,`GroupID`)
) ;

Since there are several things that will be linked to groups I decided to use one table to create all links and the The "LinkType" field to designate which think we are linking to a group.

For example suppose I had page 18 linked to group 2, 5, 6, and 7 and I had User 23 linked to group 1, 2, and 9. The rows in the table would be like this....

group, 18, 2
group, 18, 5
group, 18, 6
group, 18, 7
user, 23, 1
user, 23, 2
user, 23, 9

Now I want to know if user 23 can access page 18 so I execute this query

SELECT COUNT(`GroupID`)
FROM `grouplink` u
JOIN `grouplink` p USING(`GroupID`)
WHERE u.`LinkType` = 'user' AND p.`LinkType` = 'page'
AND u.`ID` = '23' AND p.`ID` = '18'

Since User 23 and Page 18 are both linked to group 2, COUNT(`GroupID`) should return 1. The way the rules I have set work, if the count is 1 or larger then that user has access to the page.

Now the question is there anything I can do to make this query faster?

--
Chris W
KE5GIX

"Protect your digital freedom and privacy, eliminate DRM, learn more at http://www.defectivebydesign.org/what_is_drm";

Ham Radio Repeater Database.
http://hrrdb.com


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to