2011-03-18 125 views
1

我有一个具有多对多关系的MySQL应用程序。我的主表是我的材料表。在我所有的其他表格中,我都有一个material_id来匹配表格ID。因此,在我的供应商表中,我有supplier_idmaterial_id.我是否需要SQL表中不存在的空值

对于此应用程序,某些材料没有供应商。对于我的SQL SELECT语句正确返回没有该材料的供应商,我是否应该为该supplier_id输入NULL以匹配material_id?或者SQL JOIN声明不会返回结果,我可以在我的PHP中相应地编写脚本?

回答

1

我甚至不会为映射创建NULL条目。

你需要一个outer join,像

select * from materials m left outer join suppliers s on (m.material_id=s.material_id); 

它将为供应商自动返回空值。

0

您不需要填写NULL s。你想要的是一个outer join。维基百科:

左外连接的结果(或 只是左连接)为表A和B 总是包含 “左”表(A)的所有记录,即使 join-条件在“右”表 (B)中找不到任何 匹配记录。这意味着如果ON子句 与B中的0(零)记录匹配,则 连接仍将返回 结果中的一行,但B中每列 都为NULL。这意味着左外部 连接返回全部来自 左表的值以及来自 右表的匹配值(或者在没有 匹配连接谓词的情况下为NULL)。

-1

...我应该有 一个空的条目supplier_id匹配 material_id?或者SQL JOIN 声明不会返回结果,并且我的 可以在我的PHP中相应地编写脚本?

两者。都不是。

“null”的意思是“我没有关于此的信息”。如果没有供应商,合乎逻辑的事情是将列留空。

但是,考虑到你在谈论一个表示多对多关系的“连接表”,最好不要在连接表中插入一条记录。毕竟,从逻辑上讲,缺乏记录显示与供应商没有任何关系。

您可能需要一个外部联接查询时,虽然使这一切工作......

+0

我不会建议把NULL作为ID的映射,以表明关系的一侧没有statisfied。这是肮脏和不必要的数据。只有当供应商确实存在时,映射中的行才应该存在。 – Falcon 2011-03-18 16:17:25

+0

完全正确 - 我没有正确阅读。如果它是“多对多”,只是不要在关系表中记录一条记录。 – 2011-03-18 16:37:33

+0

如果你编辑你的答案,我会收回downvote。 – Falcon 2011-03-18 17:49:24

相关问题