2011-03-18 126 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

相關問題