我有五个表:如何正确构造这个sql查询?
用户
user_id | name
--------------------
0 | Mark
1 | Jen
2 | Mbali
3 | Mbabani
4 | Fang Zhao
角色
role_id | name
--------------------
3 | Employee
4 | Customer Asia
5 | Customer Africa
User_Role_Assoc
role_id | user_id
--------------------
3 | 0
3 | 1
3 | 2
5 | 3
4 | 4
个
Role_Reps
role_id | user_id
--------------------
4 | 0
4 | 1
请求
req_id | user_id
--------------------
8 | 3
9 | 3
10 | 4
11 | 4
马克,仁和姆巴利是一个虚构的公司的所有员工(ROLE_ID = 3)。另外两名用户Mbabani和Fang Zhao是创建请求的客户。
该查询应该能够看到req_id 8和9是由属于Customer分配代表(Role_Reps)的Customer Africa角色(通过User_Role_Assoc)的用户(Mbabani [3])请求的。
查询应该能够看到req_id 10和11是由属于Customer Asia角色(通过User_Role_Assoc)拥有代表的用户(Fang Zhao [4])请求的。
所有员工应该能够看到所有请求。除非在Role_Reps表中有角色代表被分配给该角色。如果有任何代表,在这种情况下,马克和仁,他们是唯一允许看到请求。如果在Role_Reps表中没有定义任何代表,那么每个人都应该能够看到这些请求。
所以我需要一个查询:
如果我传递一个userid=2
(姆巴利)我应该得到以下结果:
req_id | user_id
--------------------
10 | 4
11 | 4
如果我通过在userid=0
或userid=1
(马克或仁)我应该得到以下结果:
req_id | user_id
--------------------
8 | 3
9 | 3
10 | 4
11 | 4
我希望我已经说清楚了。
UPDATE
这里是的DDL生成与数据表:
DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user (
userid integer PRIMARY KEY,
name varchar(20)
);
GRANT ALL PRIVILEGES ON t_user TO PUBLIC;
INSERT INTO t_user (userid, name) VALUES (0,'Mark');
INSERT INTO t_user (userid, name) VALUES (1,'Jen');
INSERT INTO t_user (userid, name) VALUES (2,'Mbali');
INSERT INTO t_user (userid, name) VALUES (3,'Mbabani');
INSERT INTO t_user (userid, name) VALUES (4,'Fang Zhao');
DROP TABLE IF EXISTS t_role;
CREATE TABLE t_role (
roleid integer PRIMARY KEY,
name varchar(20)
);
GRANT ALL PRIVILEGES ON t_role TO PUBLIC;
INSERT INTO t_role (roleid, name) VALUES (3,'Employee');
INSERT INTO t_role (roleid, name) VALUES (4,'Customer Asia');
INSERT INTO t_role (roleid, name) VALUES (5,'Customer Africa');
DROP TABLE IF EXISTS t_user_role_assoc;
CREATE TABLE t_user_role_assoc (
roleid integer,
userid integer,
primary key(roleid, userid)
);
GRANT ALL PRIVILEGES ON t_user_role_assoc TO PUBLIC;
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (3,0);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (3,1);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (3,2);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (5,3);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (4,4);
DROP TABLE IF EXISTS t_role_reps;
CREATE TABLE t_role_reps (
roleid integer,
userid integer,
primary key(roleid, userid)
);
GRANT ALL PRIVILEGES ON t_role_reps TO PUBLIC;
INSERT INTO t_role_reps (roleid, userid) VALUES (4,0);
INSERT INTO t_role_reps (roleid, userid) VALUES (4,1);
DROP TABLE IF EXISTS t_request;
CREATE TABLE t_request (
req_id integer PRIMARY KEY,
userid integer
);
GRANT ALL PRIVILEGES ON t_request TO PUBLIC;
INSERT INTO t_request (req_id, userid) VALUES (8,3);
INSERT INTO t_request (req_id, userid) VALUES (9,3);
INSERT INTO t_request (req_id, userid) VALUES (10,4);
INSERT INTO t_request (req_id, userid) VALUES (11,4);
是的,睡了之后我意识到我会以错误的方式去做。 – capdragon 2012-02-03 14:06:30