MySQL一对多获得无匹配记录

时间:2017-12-20 03:38:40

标签: mysql

我不擅长解释事情所以请耐心等待......这就是我想要做的事情。如果我正在寻找带有" 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时,我仍会得到相同的结果。

1 个答案:

答案 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
;

Demo

| 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) |