БАЗА ДАННЫХ 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 не связано с идентификатором участника в таблице участников, то он еще не подписался.
Я написал много запросов, но ни один из них не смог охватить прецедент. Пример (нерабочий):
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
Чтобы сделать это лучше, попытайтесь сломать свои условия в маленьких кусках:
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