SQL выбор данных на основе отношения «один ко многим» - PullRequest
1 голос
/ 01 августа 2020

Я немного борюсь со следующими отношениями сущностей базы данных:

введите описание изображения здесь

Я хотел бы создать запрос, в котором я получаю все события для пользователя, который является владельцем (item-user_id) или участником (member-user_id)

Я получил вернемся к собственным запросам, потому что их легче опробовать. Но связь "один ко многим" между регистрацией и участником у меня не работает.

Пробовал joins, sub-queries в предложении where и unions .. но пока ничего не работало . Вот несколько примеров:

Сначала тот, у которого есть объединение ->, но он возвращает не правильный результат

select e.id, e.has_location, e.has_registration, e.parent_id, e.published, e._end, e.start
from event e
         inner join item i on e.id = i.id
where i.user_id = 2 and start >= '2020-08-01T00:00:00'
union
select e.id, e.has_location, e.has_registration, e.parent_id, e.published, e._end, e.start
from event e
         inner join registration_participants r on r.registration_id = e.id
         inner join participant p on r.participants_id = p.id
where p.user_id = 2
  and e.has_registration
  and p.status != 'CANCELED'
  and start >= '2020-08-01T00:00:00'
order by start;

, чем результат с некоторым подзапросом ->, но результат также неверный

select e.id, e.has_location, e.has_registration, e.parent_id,
e.published, e.start, e._end from event e
         inner join item i on e.id = i.id where i.user_id = 2    or (select p.user_id
       from participant p
                inner join registration_participants r on e.id = r.registration_id
       where r.participants_id = p.id
         and p.status != 'CANCELED'
      ) = 2 order by e.start

1 Ответ

0 голосов
/ 01 августа 2020

Один метод использует exists:

select e.*
from event e
where exists (select 1 from item i where i.id = e.id and i.user_id = 2) or
      exists (select 1 from registration r where r.registration_id = e.id and r.participant = 2);

Я не уверен, какие еще условия (например, дата и статус). Они не описаны в вопросе или модели данных.

Тем не менее, кажется очень неправильным, что условие join между item и event будет в столбце позвонил id. Я ожидал, что он будет использовать event_id или item_id. Если у вас возникла проблема, я подозреваю, что она связана с условиями присоединения.

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