MYSQL左连接或从子查询获取值,如果值存在

时间:2011-10-16 21:12:18

标签: mysql sql join

我有以下查询,它工作正常,没有问题

SELECT description category,
      details,
      created_by,
      CONCAT(name,' ',surname) name,
      FROM_UNIXTIME(createdon) created_date,
      FROM_UNIXTIME(updatedon) updated_date,
      comments_count,
      entry_id,
      code car_code
FROM my_area_details,my_user,my_master_area_categories 
WHERE type=4 
AND code IN ( SELECT car_code 
             FROM my_cars
         WHERE car_company='GM' 
             AND car_model='Chevy') 
AND my_area_details.created_by=my_user.user_id 
AND my_area_details.category=my_master_area_categories.type_id
ORDER BY category

在上面的查询中,下面的子查询只返回一个值或什么都没有

 SELECT car_code 
 FROM my_cars
 WHERE car_company='GM' 
 AND car_model='Chevy'

在第一次查询中,如果我的其他表没有任何匹配的记录,我会得到零记录。

我的要求是如果子查询有值并且主查询没有返回任何记录(由于在其他表中找不到记录),我至少应该从my_cars获取car_code的值(其他值可以为NULL)

为此,我尝试将子查询添加为别名表,并确实与该别名表保持连接, 但由于我有其他条件,我仍然没有得到汽车代码。也尝试加入另外三个表,结果左边连接my_car表。但是这个花费时间,因为我没有检查第一级查询中的汽车代码

任何方式加入并从my_cars表中获取car_code,即使我的其他表没有任何匹配的东西......?

1 个答案:

答案 0 :(得分:3)

您可以再次连接其余表car_code,从而使car_code成为主要查询。 或者直接加入car_code到您当前的查询,这基本上具有相同的效果,但我建议不要混合左连接和右连接。

问题是你总是需要一个car_code,否则你不会得到其他数据(你现在遇到同样的问题,但反过来说),但是当我阅读你的要求时,这应该不是问题:

我强烈建议您在表中使用更一致的字段名称,并使用INNER和LEFT连接以及表别名来提高可读性。您的查询可能看起来像这样,虽然它不完整,因为我不知道您的表之间的确切关系。

   SELECT description category,
          details,
          created_by,
          CONCAT(name,' ',surname) name,
          FROM_UNIXTIME(createdon) created_date,
          FROM_UNIXTIME(updatedon) updated_date,
          comments_count,
          entry_id,
          code car_code
     FROM car_code cc
LEFT JOIN my_area_details ad ON ad.code = cc.car_code 
                            AND ad.type = 4 
LEFT JOIN my_user u ON u.user_id = ad.created_by
LEFT JOIN my_master_area_categories mac ON mac.type_id = ad.category
    WHERE car_code.car_company = 'GM'
      AND car_code.car_model = 'Chevy'    
 ORDER BY category