Что у меня есть:
SELECT jobs.id
FROM jobs
LEFT JOIN employees_jobs
ON employees_jobs.job_id = jobs.id
LEFT JOIN line_items
ON line_items.job_id = employees_jobs.job_id
LEFT JOIN employee_statements
ON line_items.employee_statement_id = employee_statements.id
WHERE (
employee_statements.employee_id != 17 OR
employee_statements.employee_id IS NULL
)
AND employees_jobs.employee_id = 17
GROUP BY jobs.id
ORDER BY jobs.delivery_date ASC
employee_statements
, много line_items
(внешний ключ employee_statements_id
в таблице line_items
). jobs
также имеет множество line_items
(внешний ключ job_id
в таблице line_items
).
(line_items
в основном таблица соединения для employee_statements
и jobs
)
employees_jobs
- это таблица соединений для связи «многие ко многим» между таблицей employees
и таблицей jobs
. employee_statements
принадлежат employees
(внешний ключ employee_id
в таблице employee_statements
)
Что я пытаюсь сделать:
У меня есть сценарий, в котором заявления сотрудниковсоздан с позициями.Эти позиции ссылаются на выполненные задания.На каждую работу может быть назначено несколько сотрудников.
Допустим, у нас есть сотрудник с id = 17
.Я хочу получить все вакансии, которые еще не были связаны с позицией ни в одном из его предыдущих отчетов о сотрудниках.
Итак, все они будут включены в результаты:
- Все задания, над которыми работал сотрудник 17, не связаны с позицией.
- Все задания, над которыми работал сотрудник 17, были связаны с позицией в выписке другого сотрудника.
Таким образом, если сотрудник 17 и сотрудник 14 работали на одной и той же работе, и в одном из утверждений сотрудника 14 уже есть позиция для этой работы (но в отчетах сотрудника 17 нет этой позиции), задание должно отображаться врезультат моего запроса.
Где я в тупике:
Приведенный выше запрос возвращает все задания, над которыми работал сотрудник 17, независимо от того, были ли они назначены на чью-либо строку.
Я понимаю, почему.
В условной логике я проверяю, есть ли employee_statements.employee_id IS NULL
.Это возвращает задания, которых нет ни в одном утверждении.
Я также проверяю на employee_statements.employee_id != 17
.Это для заданий, которые указаны в отчетах других сотрудников.
Таким образом, по сути, я получаю все задания, над которыми он работал, в результате, независимо от того, назначил ли он одно себе (потому что если другой сотрудникесли это назначено, второе условие захватывает это).Я не могу понять, как сказать это, чтобы вернуть только те работы, которые я хочу.(это был долгий день.;))