У меня есть четыре основных таблицы:
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'
Спасибо.
Он возвращает 4 строки, потому что t_friends содержит 4 совпадающих строки, если вы хотите вернуть 5 строк, вы можете заменить внутреннее соединение левым соединением с t_friends
@KKK прав, спасибо.
Вы можете отметить этот вопрос отвеченным.
В дополнение к комментарию KKK используйте предложение DISTINCT после SELECT. вы получите 7 отдельных элементов / строк. Это потому, что элемент может быть включен дважды, оценивая любое из условий where.
@ Mankind_008 Да, спасибо.


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