我不擅长解释事情所以请耐心等待......这就是我想要做的事情。如果我正在寻找带有" YES"的文档,我想得到没有匹配记录的行的结果(tbl_personnel_documents)。优先权和基于他们的立场。 这是员工表格的结构:
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
在这种情况下,John的职位是IT经理,表中没有护照记录(tbl_personnel_documents)。由于文档Passport是IT Manager的优先级文档,但它缺失,因此必须显示结果。 我目前卡在这里..我无法得到理想的结果..这是我的代码:
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's 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's ID
AND tpriority.document_id IS NULL
GROUP BY td.id
现在我的问题是每当我更改tbl_priority_docs_per_position的position_id时,我仍会得到相同的结果。
答案 0 :(得分:0)
使用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's 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) |