Присоединиться к 4 столам в Postgres

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

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_items_users (
access_iu_id varchar PRIMARY KEY,
item_id varchar not null references t_items(item_id),
user_id varchar not null references t_users(user_id)
);

CREATE TABLE t_friends (
friend_id varchar PRIMARY KEY,
from_user_id varchar not null references t_users(user_id),
to_user_id varchar not null references t_users(user_id)
);

С данными:

INSERT INTO t_users VALUES ('us123', '[email protected]');
INSERT INTO t_users VALUES ('us456', '[email protected]');
INSERT INTO t_users VALUES ('us789', '[email protected]');
INSERT INTO t_users VALUES ('public', '[email protected]');

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_items_users VALUES ('aiu123', 'it123', 'us123');
INSERT INTO t_access_items_users VALUES ('aiu456', 'it456', 'us456');
INSERT INTO t_access_items_users VALUES ('aiu678', 'it678', 'us789');
INSERT INTO t_access_items_users VALUES ('aiu323', 'it323', 'us123');
INSERT INTO t_access_items_users VALUES ('aiu764', 'it764', 'us456');
INSERT INTO t_access_items_users VALUES ('aiu826', 'it826', 'us789');
INSERT INTO t_access_items_users VALUES ('aiu568', 'it568', 'us123');
INSERT INTO t_access_items_users VALUES ('aiu038', 'it038', 'us456');
INSERT INTO t_access_items_users VALUES ('aiu728', 'it728', 'us789');
INSERT INTO t_access_items_users VALUES ('aiu728', 'it728', 'us789');
INSERT INTO t_access_items_users VALUES ('apu123', 'it678', 'public');
INSERT INTO t_access_items_users VALUES ('apu222', 'it123', 'public');
INSERT INTO t_access_items_users VALUES ('apu111', 'it456', 'public');
INSERT INTO t_access_items_users VALUES ('aiu333', 'it728', 'public');
INSERT INTO t_access_items_users VALUES ('aiu444', 'it826', 'public');

INSERT INTO t_friends VALUES ('f123', 'us123', 'us456');

Запрос на тип:

select *
from t_access_items_users
inner join t_items on t_access_items_users.item_id = t_items.item_id
inner join t_users on t_access_items_users.user_id = t_users.user_id
where t_access_items_users.user_id = 'public';

возвращает 5 строк.

Почему тип запроса:

select 
t_items.item_id,
t_items.owner_id,
t_items.title
from t_access_items_users
inner join t_items on t_access_items_users.item_id = t_items.item_id
inner join t_friends on t_items.owner_id = t_friends.from_user_id
where t_friends.to_user_id = 'us456'
or t_access_items_users.user_id = 'public';

возвращает 4 строки? Как сделать правильный запрос, чтобы получить все нужные строки? В конечном итоге я хочу получить данные о том, где у элементов есть доступ к публике и с друзьями пользователя. Как сделать запрос, возвращающий все элементы, которые:

t_friends.to_user_id = 'us456'
or t_access_items_users.user_id = 'public'

Спасибо.

Похоже, в ваших тестовых данных отсутствуют данные для t_friends.

edruid 19.05.2018 23:27

Он возвращает 4 строки, потому что t_friends содержит 4 совпадающих строки, если вы хотите вернуть 5 строк, вы можете заменить внутреннее соединение левым соединением с t_friends

user8406805 19.05.2018 23:28

@KKK прав, спасибо.

Sergey Kozlov 19.05.2018 23:43

Вы можете отметить этот вопрос отвеченным.

user8406805 19.05.2018 23:44

В дополнение к комментарию KKK используйте предложение DISTINCT после SELECT. вы получите 7 отдельных элементов / строк. Это потому, что элемент может быть включен дважды, оценивая любое из условий where.

Mankind_008 20.05.2018 03:00

@ Mankind_008 Да, спасибо.

Sergey Kozlov 20.05.2018 18:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
321
0

Другие вопросы по теме