我有3张桌子:
Vehicle: vehicle_id, vehicle_type 1, motorcycle 2, car 3, van Owners: person_id, vehicle_id, date_bought 1, 1, 2009 1, 2, 2008 2, 3, 2009 2, 1, 2005
我想显示所有车辆名称的列表。如果person_id = 1,date_bought也应返回。
person_id = 1
date_bought
所以我想我将从这里开始:
SELECT * FROM vehicles LEFT JOIN Owners USING (vehicle_id)
返回以下内容:
1, 1, motorcycle, 2009 1, 2, car, 2008 2, 3, van, 2009 2, 1, motorcycle, 2005
但是,我现在无法将其范围缩小到所需的结果。如果使用DISTINCT(car_id),则没有任何变化,因为我已经在JOIN之前选择了不同的汽车ID。加入后它们才是唯一的。如果使用WHERE person_id = 1,则删除最后两行,所有对货车的引用都消失了。如果使用GROUP BY car_id,则将第一行和最后一行合并,但是date_bought摩托车的则是任意选择的。我想要的是:
DISTINCT(car_id)
WHERE person_id = 1
GROUP BY car_id
1, 1, motorcycle, 2009 1, 2, car, 2008 , 3, van,
我需要一个唯一的汽车ID,但这是在JOIN之前发生的,因此完全没有效果。如何通过JOIN获得唯一性?
您需要在联接中包括对人员ID的限制,并使用外部联接。即使您要加入的表中没有记录,也要使用外部联接来返回信息。尝试
SELECT person_id, vehicles.* FROM vehicles LEFT OUTER JOIN Owners on vehicles.vehicle_id = owners.vehicle_id and person_id = 1