Я не очень хорошо объясняю вещи, поэтому, пожалуйста, несите меня. Вот что я пытаюсь сделать. Я хочу получить результат строк без соответствующей записи в таблице (tbl_personnel_documents), если я ищу документы с приоритетом "YES" и основываясь на их позиции. Здесь структура таблицы для сотрудника:
tbl_personnel_info
id name position_id
1 John 1
2 Sharyn 2
3 Stacie 4
4 Kevin 3
5 Cristine 3
Таблица для позиции:
tbl_position
id position_name
1 IT Manager
2 Accounting Staff
3 IT Staff
4 H.R Manager
5 Admin Staff
Таблица для персонала:
tbl_personnel_documents
id personnel_id document_id document_num
1 1 3 111-222-333-444
2 1 4 AB-CC-DD
3 2 1 CC-BB-DD
4 4 2 1-2-3-4-5
5 3 4 C1-D2-X1-D2-G3
Таблица имен документов
tbl_documents
id document_name priority
1 Passport YES
2 ROPC NO
3 US Visa YES
4 AUS Visa YES
Таблица приоритетов документов на основе их позиции
tbl_priority_docs_per_position
id position_id document_id
1 1 1
2 1 3
3 1 4
В этом случае позиция Джона - это ИТ-менеджер, у которого нет записи паспорта в таблице (tbl_personnel_documents). И поскольку документ Passport является приоритетным документом для ИТ-менеджера, но он отсутствует, он должен отображать результат. Im в настоящее время застрял здесь.. Я не могу получить желаемый результат.. Вот мой код:
SELECT td.document_name
FROM tbl_personnel_info AS tpi
LEFT JOIN tbl_position AS tp
ON tp.id = tpi.position_id
LEFT JOIN tbl_personnel_documents AS tpd
ON tpi.id = tpd.personnel_id
LEFT JOIN tbl_documents AS td
ON td.id = tpd.document_id
LEFT JOIN tbl_priority_docs_per_position AS tpriority
ON tpriority.position_id = tpi.position_id AND tpriority.document_id = tpd.document_id
WHERE td.priority = 'YES'
AND tpi.id = 1 -- John ID
AND tpriority.document_id IS NULL
Пожалуйста, помогите.. Спасибо
Обновление: мне удается частично получить результат с помощью этого кода:
SELECT td.document_name
FROM tbl_personnel_info AS tpi
LEFT JOIN tbl_position AS tp
ON tp.id = tpi.position_id
LEFT JOIN tbl_personnel_documents AS tpd
ON tpi.id = tpd.personnel_id
LEFT JOIN tbl_documents AS td
ON td.priority = 'YES'
LEFT JOIN tbl_priority_docs_per_position AS tpriority
ON tpriority.position_id = tpi.position_id AND tpriority.document_id = tpd.document_id
WHERE tpi.id = 1 -- John ID
AND tpriority.document_id IS NULL
GROUP BY td.id
Теперь моя проблема - когда я изменяю position_id из tbl_priority_docs_per_position, я все равно получаю тот же результат.
Когда вы используете left join
вы должны быть очень осторожны, как вы ссылаетесь на эту таблицу в предложении where, или вы можете переопределить соединение. Здесь, однако, я считаю, что это последовательность объединений:
SELECT
*
FROM tbl_personnel_info AS tpi
INNER JOIN tbl_position AS tp ON tp.id = tpi.position_id
INNER JOIN tbl_priority_docs_per_position AS tpriority ON tpriority.position_id = tpi.position_id
LEFT JOIN tbl_personnel_documents AS tpd ON tpi.id = tpd.personnel_id
AND tpriority.document_id = tpd.document_id
LEFT JOIN tbl_documents AS td ON td.id = tpd.document_id
WHERE tpi.id = 1 -- John ID
AND td.priority IS NULL
;
| id | name | position_id | id | position_name | id | position_id | document_id | id | personnel_id | document_id | document_num | id | document_name | priority |
|----|------|-------------|----|---------------|----|-------------|-------------|--------|--------------|-------------|--------------|--------|---------------|----------|
| 1 | John | 1 | 1 | IT Manager | 1 | 1 | 1 | (null) | (null) | (null) | (null) | (null) | (null) | (null) |