繁体   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