我有一个包含'小部件'记录的表,许多列只包含不同表中记录的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动态构建此查询,因此我尝试尽可能简单。欢迎所有的消息,谢谢。
答案 0 :(得分:0)
问题是您使用的是隐式inner join
(隐含意味着您在where
子句中进行连接)。内部联接仅返回匹配记录,因此如果某些数据不完整,则不会返回任何记录。
使用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
答案 1 :(得分:-1)
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子句中使用连接而不是多个表。
答案 2 :(得分:-1)
而不是直接连接使用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
应该有self.slider.trackRect(forBounds: CGRect(x: 0, y: 0, width: 100, height: 100))
id
如果关系不同,我可能错了