动态创建的sql不开心

时间:2017-01-31 13:40:50

标签: php mysql

我有一个包含'小部件'记录的表,许多列只包含不同表中记录的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动态构建此查询,因此我尝试尽可能简单。欢迎所有的消息,谢谢。

3 个答案:

答案 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

表格列应为小写

表名应采用单数形式,例如modelshape

外键应该在其他表中。取代widget ModelId而不是modelwidget应该有self.slider.trackRect(forBounds: CGRect(x: 0, y: 0, width: 100, height: 100)) id

如果关系不同,我可能错了