簡體   English   中英

動態創建的sql不開心

[英]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

表列應為小寫


表名應該是單數形式,例如modelshape


外鍵應該在其他表中。 取而代之的widgetModelIdmodel應該有widget ID

如果關系不同,我可能是錯的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM