Внутренний запрос на присоединение, чтобы получить элементы, доступные для пользователя - PullRequest
0 голосов
/ 18 мая 2018

У меня есть четыре таблицы:

CREATE TABLE t_users (
user_id varchar PRIMARY KEY,
user_email varchar
);

CREATE TABLE t_items (
item_id varchar PRIMARY KEY,
owner_id varchar not null references t_users(user_id),
title varchar
);

CREATE TABLE t_access_gropes (
access_group_id varchar PRIMARY KEY,
user_id varchar not null references t_users(user_id)
);

CREATE TABLE t_access_sets (
access_set_id varchar PRIMARY KEY,
item_id varchar not null references t_items(item_id),
access_group_id varchar not null references t_access_gropes(access_group_id)
);

С данными:

INSERT INTO t_users VALUES ('us123', 'us123@email.com');
INSERT INTO t_users VALUES ('us456', 'us456@email.com');
INSERT INTO t_users VALUES ('us789', 'us789@email.com');

INSERT INTO t_items VALUES ('it123', 'us123', 'title1');
INSERT INTO t_items VALUES ('it456', 'us456', 'title2');
INSERT INTO t_items VALUES ('it678', 'us789', 'title3');
INSERT INTO t_items VALUES ('it323', 'us123', 'title4');
INSERT INTO t_items VALUES ('it764', 'us456', 'title5');
INSERT INTO t_items VALUES ('it826', 'us789', 'title6');
INSERT INTO t_items VALUES ('it568', 'us123', 'title7');
INSERT INTO t_items VALUES ('it038', 'us456', 'title8');
INSERT INTO t_items VALUES ('it728', 'us789', 'title9');

INSERT INTO t_access_gropes VALUES ('ag123', 'us123');
INSERT INTO t_access_gropes VALUES ('ag456', 'us456');
INSERT INTO t_access_gropes VALUES ('ag789', 'us789');

INSERT INTO t_access_sets VALUES ('as123', 'it123', 'ag123');
INSERT INTO t_access_sets VALUES ('as456', 'it456', 'ag123');

t_access_gropes образует группы пользователей. t_access_sets формирует наборы безопасности.

Как сделать запрос для получения всех предметов , доступных для пользователя .Что-то вроде:

select *
from t_items
inner join t_users on t_items.owner_id = t_users.user_id
inner join t_access_gropes on t_users.user_id = t_access_gropes.user_id
inner join t_access_sets on t_items.item_id = t_access_sets.item_id
where t_access_gropes.user_id = 'us123';

Спасибо.

1 Ответ

0 голосов
/ 18 мая 2018
select u.user_id, u.email, i.item_id, i.title
from t_users u
  join t_items i on i.owner_id = u.user_id
where u.user_id = 'us123'

Я считаю, что это именно то, что вам нужно для вашего точного запроса!

В противном случае то, что вы написали, будет в порядке, однако я не вижу актуальности в таблицах, которые вы объединили, так как вы напрямую подключили свою таблицу пользователей иТаблица элементов вместе, поэтому вам не нужно объединять две другие таблицы (группы и наборы).Обычно в некоторых случаях вы найдете таблицу user_items между таблицей users и items.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...