【问题标题】:MySQL join not behaving as expectedMySQL 连接未按预期运行
【发布时间】:2016-11-11 15:31:59
【问题描述】:

我创建了一个 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 : 包含已扫描文档的框列表
  • clients : 签发扫描文件的客户列表
  • utilisateurs : 正在扫描文档的个人列表

连接是在表的主键上执行的。

我的目标是从每个盒子 (boite_archive) 中获取已扫描文档 (documents_scannes) 的列表,同时获取客户端名称 (从客户端表) 和完成扫描的操作员的名称 (来自表 utilisateurs)。

我的问题是当我:

SELECT * FROM documents_scannes_view WHERE num_boite = '1131';

1131 号箱子是空的,里面没有扫描的文件,但我得到了一行:

谁能帮我指出错误的根源以及如何纠正它? 提前致谢。

我不确定查询底部的连接。这是问题的根源。当盒子是 emprt 时,我如何修复它以获得没有结果?

【问题讨论】:

  • 这是 1130 是拼写错误,空框是 1131。我更正了错误输入的数字。
  • 导致错误的不是数字周围的 '',因为它正在与其他框数字一起使用。
  • 那我看不出有什么问题。引擎正在做你想做的事。它返回 boite_archive 中匹配 1131 的 1 条记录;并且由于其他表中没有对应的记录匹配,因此所有其他字段都为空。具体来说,查看 boite_archive 是否只有 1131 1 条记录?现在只看 1131 的documents_scannes。没有记录对吗?那里缺少记录会导致所有其他值都为空!
  • 在没有文件的情况下得到结果是不是很奇怪?
  • 我不确定查询底部的连接。这是问题的根源。当盒子是 emprt 时,我如何修复它以获得没有结果?

标签: mysql join left-join database-view


【解决方案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

Image ref.

【讨论】:

  • 通过搜索我发现: LEFT JOIN 关键字返回左表(table1)中的所有行,以及右表(table2)中的匹配行。没有匹配时,右边的结果为NULL。
  • 我个人最喜欢解释基本连接的一个:blog.codinghorror.com/a-visual-explanation-of-sql-joins我也喜欢图片和更新!
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2015-06-17
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多