我有一些奇怪的情况,我似乎无法为其构建查询。感谢帮助。
这是我目前的查询:
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
确实匹配保险表中的至少一条记录,但因此没有匹配的策略跨越请求日期。
如何改善查询?
答案 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。