在JOIN之后选择DISTINCT值

时间:2009-12-22 05:37:23

标签: sql mysql join group-by distinct

我有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 = 1date_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,我删除最后2行,所有对货车的引用都消失了。如果我使用GROUP BY car_id,则会合并第一行和最后一行,但摩托车的date_bought是任意选择的。我想要的是这个:

1, 1, motorcycle, 2009
1, 2, car, 2008
 , 3, van, 

我需要一个不同的汽车ID,但这发生在JOIN之前,所以根本没有效果。如何通过JOIN获得唯一性?

2 个答案:

答案 0 :(得分:6)

您需要在联接中包含对人员ID的限制,并使用外部联接。即使您要加入的表中没有记录,也希望返回信息时使用外部联接。尝试

SELECT person_id, vehicles.* 
FROM vehicles 
LEFT OUTER JOIN Owners on vehicles.vehicle_id = owners.vehicle_id 
and person_id = 1

答案 1 :(得分:3)

这应该返回您列出的预期输出:

   SELECT DISTINCT
          o.person_id,
          v.vehicle_id,
          v.vehicle_type,
          o.date_bought
     FROM VEHICLES v
LEFT JOIN OWNERS o ON o.vehicle_id = v.vehicle_id
LEFT JOIN (SELECT t.vehicle_id,
                  MAX(t.date_bought) 'max_date_bought'
            FROM OWNERS t
        GROUP BY t.vehicle_id) x ON x.vehicle_id = o.vehicle_id
                                AND x.max_date_bought = o.date_bought
    WHERE o.person_id IS NULL 
       OR o.person_id = 1

请注意,由于左连接,如果OWNERS表中没有匹配的vehicle_id,OWNERS列将返回NULL。