MySQL один ко многим получает не подходящую запись

0

Я не очень хорошо объясняю вещи, поэтому, пожалуйста, несите меня. Вот что я пытаюсь сделать. Я хочу получить результат строк без соответствующей записи в таблице (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, я все равно получаю тот же результат.

Теги:

1 ответ

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 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) |
  • 0
    Привет, я попробовал оба ваших кода. Но это не работает. :(
  • 0
    извини, это было не то, что я думал. Я пересмотрел ответ. Обратите внимание, что некоторые соединения теперь являются внутренними соединениями.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню