[英]Dynamically created sql not happy
我有一個包含“小部件”記錄的表,其中許多列僅包含不同表中記錄的 ID。 編輯小部件記錄時,即使記錄不完整,用戶也可以進行保存。 他們可以稍后打開它並繼續。 我遇到的問題是,當它不完整時,我的查詢不返回任何內容,因為 where 子句包含其中默認為 0 的字段,而其他表中沒有匹配項。 這是說明此問題的腳本示例。
select Client,Make,Model,Shape
from
widget,clients,makes,models,shapes
where
widget.ClientId = '3' and
widget.MakeId = makes.Id and
widget.ModelId = models.Id and
widget.ShapeId = shapes.Id
我正在使用 PHP 動態構建此查詢,因此我試圖使其盡可能簡單。 歡迎所有建議,謝謝。
問題在於您使用的是隱式inner join
(隱式意味着您在where
子句中進行連接)。 內連接只返回匹配的記錄,因此如果某些數據不完整,則不會返回任何記錄。
改用outer join
,它返回outer join
一個表中的所有記錄和另一個表中的匹配記錄(MySQL 不支持完全外連接,但這在這里無關緊要)。
根據您的描述widget
表是您的主表,因此使用left join
連接widget
上的所有其他表以獲取小部件,即使它不完整:
select c.Client, m.make, md.model, s.shape
from widget w
left join clients c on c.id = w.ClientId
left join makes m on m.id = w.MakeId
left join models md on md.id = w.ModelId
left join shapes s on s.id = w.ShapeId
select c.Client, m.make, md.model, s.shape
from widget w
join clients c on c.id = w.ClientId
join makes m on m.id = w.MakeId
join models md on md.id = w.ModelId
join shapes s on s.id = w.ShapeId
在 FROM 子句中使用連接而不是多個表。
而不是直接連接使用LEFT JOIN
這樣無論是否有來自其他表的記錄,仍然會返回第一個表條目:
SELECT Client, Make, Model, Shape
FROM widget
LEFT JOIN clients ON widget.ClientId = widget.Id
LEFT JOIN makes ON widget.MakeId = makes.Id
LEFT JOIN models ON widget.ModelId = models.Id
LEFT JOIN shapes ON widget.ShapeId = shapes.Id
WHERE widget.ClientId = 3
表列應為小寫
表名應該是單數形式,例如model
, shape
外鍵應該在其他表中。 取而代之的widget
有ModelId
, model
應該有widget
ID
如果關系不同,我可能是錯的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.