У меня есть пять таблиц:
Пользователь
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 был запрошен пользователем (Mbabani [3]), который принадлежит роли Customer Africa (посредством User_Role_Assoc), у которой нет назначенных представителей (Role_Reps).
В запросе должна быть возможность увидеть, что req_id 10 и 11 были запрошены пользователем (Fang Zhao [4]), который принадлежит роли Customer Asia (через User_Role_Assoc), которая имеет представителей.
Все сотрудники должны видеть все запросы.Если в таблице Role_Reps нет представителя роли, назначенного этой роли.Если есть какие-либо представители, в данном случае Марк и Джен, они ЕДИНСТВЕННЫЕ, которым разрешено видеть запрос.Если в таблице Role_Reps не определено ни одного представителя, тогда все должны видеть запросы.
Поэтому мне нужен запрос, который:
Если я передам userid=2
(Mbali)Я должен получить следующие результаты:
req_id | user_id
--------------------
10 | 4
11 | 4
Если я передам userid=0
или userid=1
(Марк или Джен), я должен получить следующие результаты:
req_id | user_id
--------------------
8 | 3
9 | 3
10 | 4
11 | 4
IНадеюсь, я ясно дал понять.
ОБНОВЛЕНИЕ
Вот 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);