У меня есть 4 таблицы в PostgreSQL:
CREATE TABLE IF NOT EXISTS organization(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
CONSTRAINT plan_id_fk FOREIGN KEY (plan_type)
REFERENCES plan(plan_type) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE TABLE IF NOT EXISTS users(
id varchar(100) PRIMARY KEY,
email VARCHAR(50) NOT NULL UNIQUE,
);
CREATE TABLE IF NOT EXISTS organization_membership(
organization_id uuid not null,
user_id varchar(100) not null,
CONSTRAINT organization_id_fk FOREIGN KEY (organization_id)
REFERENCES organization(id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT users_uuid_fk FOREIGN KEY (user_id)
REFERENCES users(id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
PRIMARY KEY (organization_id, user_id)
);
CREATE TABLE IF NOT EXISTS project(
id uuid PRIMARY KEY DEFAULT uuid_generate_v4 (),
owner uuid NOT NULL,
project_name VARCHAR(100),
CONSTRAINT project_owner_fk FOREIGN KEY (owner)
REFERENCES organization(id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
);
Я пытаюсь получить проекты, принадлежащие пользователю 1,
поэтому я пытаюсь получить все проекты для пользователя 1 из всех организаций этого пользователя
Мне просто нужен необработанный код sql
Я пробовал это:
await database.fetch_all(
query = "SELECT organization_membership.*, organization.id FROM organization JOIN organization_membership ON organization.id = organization_membership.organization_id WHERE organization_membership.user_id = :id",
values = {'id': acting_user.id},
)
но это возвращает только организации для этого пользователя
также я пробовал это:
await database.fetch_all(
query = "SELECT * from project JOIN organization ON project.owner = organization.id JOIN organization_membership ON organization.id = organization_membership.organization_id WHERE organization_membership.user_id = :id",
values = {'id': acting_user.id},
)
это возвращает пустые данные
select p.* from users u
join organization_membership om on u.id = om.user_id
join organization o on om.organization_id = o.id
join project p on o.id = p.owner
where u.id = '1';
Обновлено: обновлено в соответствии с вопросом
Я обновил вопрос, потому что задал его неправильно
этот возвращает пустые данные
Обновление: это сработало, я неправильно тестировал. большое спасибо, мой второй запрос тоже работает.
Это во многом зависит от того, как у вас сложилась схема отношений. Но как насчет вложенных операторов SQL?
SELECT * FROM projects
WHERE organization_id in (
SELECT organization_id FROM organizations WHERE user_id = 1);
Я обновил вопрос, потому что задал его неправильно
Добро пожаловать в сообщество SO. Сообщество поможет с вашими проблемами, но на вас возлагаются определенные надежды. Пожалуйста, потратьте несколько минут, чтобы совершить тур и просмотреть Как спросить . Затем обновите свой вопрос, включив в него образцы данных, определение таблицы (скрипты ddl), ожидаемые результаты этих данных в виде текста — без изображений. Также обратите внимание на Заметки к домашнему заданию или на обучающее упражнение (что одно и то же). Включите то, что вы пробовали, также в виде текста.