MySQL LEFT JOIN并且在连接表中没有满意的匹配

时间:2014-05-14 18:32:50

标签: mysql join

我有一些奇怪的情况,我似乎无法为其构建查询。感谢帮助。

这是我目前的查询:

SELECT * 
FROM vehicle 
LEFT JOIN vehicle_insurance AS ins
ON vehicle.id=ins.vehicle_id
WHERE vehicle.id='{$vid}' 
AND ( ins.effective<='{$date}' OR ins.effective IS NULL )
AND ( ins.expires>='{$date}' OR ins.expires IS NULL )
使用有效数据正确删除

$vid$date。我想要发生的是在响应中使用vehicle表中的列,无论如何。如果我输入有效的日期,这是有效的。如果我在保险表中输入未跨越的日期,我仍然想获得有关车辆的一般信息,但我得到一个空记录集。

我认为放IS NULL子句可能对此有所帮助,但问题是LEFT JOIN确实匹配保险表中的至少一条记录,但因此没有匹配的策略跨越请求日期。

如何改善查询?

2 个答案:

答案 0 :(得分:3)

我认为你应该将你的ins条件转移到ON语句

SELECT * 
FROM vehicle 
LEFT JOIN vehicle_insurance AS ins
ON vehicle.id=ins.vehicle_id AND ins.effective<='{$date}' AND  ins.expires>='{$date}'
WHERE vehicle.id='{$vid}'

答案 1 :(得分:1)

我不使用MySQL,但如果我在SQL Server上这样做,我可能会创建一个子查询,其中包含你的保险详细信息和where子句,然后加入车辆。

这里的语法错了,但是这样的话。

SELECT * 
FROM vehicle 
LEFT JOIN 
(
   SELECT * FROM vehicle_insurance 
   WHERE ( ins.effective<='{$date}' OR ins.effective IS NULL )
     AND ( ins.expires>='{$date}' OR ins.expires IS NULL ) 
) AS ins
ON vehicle.id=ins.vehicle_id
WHERE vehicle.id='{$vid}' 

这样,保险详细信息在左边加入车辆之前就被过滤了。

有更优雅的方式,但这种方式通常可以节省我有限的脑力!

的Al。