MySQL join не работает должным образом

Я создал представление MySQL для сбора данных из четырех разных таблиц:

CREATE VIEW `documents_scannes_view` AS 
select `ds`.`id_document` AS `id_document`,
       `ba`.`num_boite` AS `num_boite`,
       `ds`.`annee` AS `annee`,
       `ds`.`ref_document` AS `ref_document`,
       `ds`.`num_client` AS `num_client`,
       `cl`.`nom_client` AS `nom_client`,
       `ds`.`nbre_a4` AS `nbre_a4`,
       `ds`.`nbre_a3` AS `nbre_a3`,
       `ds`.`nbre_autres` AS `nbre_autres`,
       ((`ds`.`nbre_autres` + `ds`.`nbre_a3`) + `ds`.`nbre_a4`) AS `nbre_total`,
       `ds`.`date_scan` AS `date_scan`,`ds`.`qualite` AS `qualite`,
       `ds`.`id_operateur` AS `id_operateur`,
       `ut`.`nom_complet` AS `nom_complet`,
       `ds`.`observations` AS `observations`,
       `ds`.`chemin` AS `chemin` 
from (((`boite_archive` `ba` left join `documents_scannes` `ds` on((`ds`.`num_boite` = `ba`.`num_boite`))) 
                             left join `clients` `cl` on((`ds`.`num_client` = `cl`.`num_client`))) 
                             left join `utilisateurs` `ut` on((`ds`.`id_operateur` = `ut`.`id_user`)))

Таблицы соответственно:

  • documents_scannes: список отсканированных документов
  • boite_archive: список ящиков с отсканированными документами
  • клиенты: список клиентов, выдавших отсканированные документы
  • utilisateurs: список сотрудников, которые сканируют документы

Объединения выполняются по первичным ключам таблиц.

Моя цель - получить список отсканированных документов (documents_scannes) из каждого ящика (boite_archive), извлекая одновременно имя клиента (из таблицы клиентов) и имя оператора, который выполнил сканирование (из таблицы utilisateurs).).

Моя проблема, когда я:

SELECT * FROM documents_scannes_view WHERE num_boite = '1131';

Ящик с номером 1131 пуст, в нем нет отсканированных документов, но я получаю одну строку:

введите описание изображения здесь

Кто может помочь мне указать источник моей ошибки и как я могу ее исправить? Заранее спасибо.

Я не уверен насчет соединений в нижней части запроса. Это источник проблемы. Как я могу это исправить, чтобы не получить результатов, когда поле пусто?

1 ответ

Решение

Если вы не хотите выбирать пустую строку, в которой столбцы соединения не совпадают, измените внутреннее соединение вместо левого.

from (((`boite_archive` `ba` inner join `documents_scannes` `ds` on((`ds`.`num_boite` = `ba`.`num_boite`))) 
                         left join `clients` `cl` on((`ds`.`num_client` = `cl`.`num_client`))) 
                         left join `utilisateurs` `ut` on((`ds`.`id_operateur` = `ut`.`id_user`)))

LEFT JOIN Ключевое слово возвращает все строки из левой таблицы (table1) с соответствующими строками в правой таблице (table2). Результат NULL в правой части, когда нет совпадения.

введите описание изображения здесь

Ссылка на изображение

Другие вопросы по тегам