【问题标题】:SELECT DISTINCT values after a JOIN在 JOIN 之后选择 DISTINCT 值
【发布时间】:2010-12-28 23:56:33
【问题描述】:

我有 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),则没有任何变化,因为我已经在 J​​OIN 之前选择了不同的汽车 ID;它们仅在加入后不明显。如果我使用WHERE person_id = 1,我会删除最后两行,所有对货车的引用都消失了。如果我使用GROUP BY car_id,第一行和最后一行是合并的,但是摩托车的date_bought 是任意选择的。我想要的是这样的:

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

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

【问题讨论】:

标签: sql mysql join group-by distinct


【解决方案1】:

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

   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。

【讨论】:

    【解决方案2】:

    您需要在联接中包含对人员 ID 的限制并使用外部联接。当您想要返回信息时使用外部连接,即使您要连接的表中没有记录。试试

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

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 2022-10-24
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      相关资源
      最近更新 更多