Как выбрать, где внешний ключ не существует в других столбцах, и сравнить даты из таблиц, которые не связаны напрямую

0

БАЗА ДАННЫХ EER-DIAGRAM: https://i.stack.imgur.com/5v87y.jpg

Итак, как это работает, у меня есть приложение php, где пользователь может предоставить свои доступные даты (см. Таблицу: availableDates) для определенного курса. Исходя из этого предпочтения, система предоставит ему информацию об исполнении казни (см. Таблицу: courseExecutions), которые соответствуют его критериям, по которым он может зарегистрироваться, что означает, что SQL-запрос должен иметь следующие требования:

  • SELECT courseExecution.courseExecutionID, courseExecution.beginDate, courseExecution.endDate, course.title, course.price, co.city ГДЕ:

  • Лицо еще не подписалось на это исполнение, это проверяется в таблице участников, если значение courseExecutionID не связано с идентификатором участника в таблице участников, то он еще не подписался.

  • Выполнение CourseExecution не должно быть сделано, довольно просто проверить, установлен ли столбец 0.
  • availableDates.beginDate меньше (<), чем courseExecution.beginDate
  • availableDates.endDate больше (>), чем courseExecution.endDAte

Я написал много запросов, но ни один из них не смог охватить прецедент. Пример (нерабочий):

SELECT c.courseExecutionID, c.beginDate, c.endDate, co.title, co.price, co.title
FROM courseExecution c
JOIN course co
ON c.courseID = co.courseID
JOIN availableDates a
ON co.courseID = a.courseID
JOIN person p 
ON a.personID = p.personID
WHERE NOT EXISTS (SELECT personID FROM participant WHERE p.personID = participant.personID)
AND c.done = 0
ORDER BY courseExecutionID
Теги:

1 ответ

1
Лучший ответ

Чтобы сделать это лучше, попытайтесь сломать свои условия в маленьких кусках:

  • SELECT courseExecution.courseExecutionID, courseExecution.beginDate, courseExecution.endDate, course.title, course.price, co.city ГДЕ:

    SELECT c.courseExecutionID, c.beginDate, c.endDate, co.title, co.price, co.title


  • Лицо еще не подписалось на это исполнение, это проверяется в таблице участников, если значение courseExecutionID не связано с идентификатором участника в таблице участников, то он еще не подписался.

    c.courseExecutionID NOT IN (SELECT courseExecutionID FROM participant)


  • Выполнение CourseExecution не должно быть сделано, довольно просто проверить, установлен ли столбец 0.

    c.done = 0


  • availableDates.beginDate меньше (<), чем courseExecution.beginDate

    a.beginDate < c.beginDate


  • availableDates.endDate больше (>), чем courseExecution.endDAte

    a.endDate > c.endDate


Добавляя ваши соединения, это должно быть примерно так:
SELECT c.courseExecutionID, c.beginDate, c.endDate, co.title, co.price, co.title
FROM courseExecution c
JOIN course co
ON c.courseID = co.courseID
JOIN availableDates a
ON co.courseID = a.courseID
WHERE c.courseExecutionID NOT IN (SELECT courseExecutionID FROM participant)
AND c.done = 0
AND a.beginDate < c.beginDate
AND a.endDate > c.endDate

Ещё вопросы

Сообщество Overcoder
Наверх
Меню