MySQL 加入行为不符合预期
MySQL join not behaving as expected
我创建了一个 MySQL 视图来从四个不同的 table 中获取数据:
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`)))
table分别是:
- documents_scannes : 扫描文档列表
- boite_archive : 包含扫描文件的盒子列表
- clients : 签发扫描文件的客户列表
- utilisateurs : 正在扫描文档的个人列表
连接是在 table 的主键上执行的。
我的objective是从每个盒子(boite_archive)中获取扫描文档的列表(documents_scannes)同时获取客户的名称(来自客户table) 和完成扫描的操作员的姓名(来自 table utilisateurs)。
我的问题是当我 :
SELECT * FROM documents_scannes_view WHERE num_boite = '1131';
1131 号箱子是空的,里面没有扫描的文件,但我得到了一行:
谁能帮我指出错误的根源以及如何改正错误?
提前致谢。
我不确定查询底部的联接。这是问题的根源。当盒子是空的时,我如何修复它以得不到任何结果?
如果您不想要 select 连接列不匹配的空行更改为内部连接而不是左连接
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
关键字 returns 从左边开始的所有行 table (table1),匹配行在右边 table (table2).没有匹配的时候右边的结果是NULL
我创建了一个 MySQL 视图来从四个不同的 table 中获取数据:
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`)))
table分别是:
- documents_scannes : 扫描文档列表
- boite_archive : 包含扫描文件的盒子列表
- clients : 签发扫描文件的客户列表
- utilisateurs : 正在扫描文档的个人列表
连接是在 table 的主键上执行的。
我的objective是从每个盒子(boite_archive)中获取扫描文档的列表(documents_scannes)同时获取客户的名称(来自客户table) 和完成扫描的操作员的姓名(来自 table utilisateurs)。
我的问题是当我 :
SELECT * FROM documents_scannes_view WHERE num_boite = '1131';
1131 号箱子是空的,里面没有扫描的文件,但我得到了一行:
谁能帮我指出错误的根源以及如何改正错误? 提前致谢。
我不确定查询底部的联接。这是问题的根源。当盒子是空的时,我如何修复它以得不到任何结果?
如果您不想要 select 连接列不匹配的空行更改为内部连接而不是左连接
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
关键字 returns 从左边开始的所有行 table (table1),匹配行在右边 table (table2).没有匹配的时候右边的结果是NULL