2011-10-16 26 views
1

我有下面的查詢和它的作品完美,沒有任何問題MySQL的左加入或子查詢獲取值,如果該值存在

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,即使我的其他表沒有任何匹配的東西......?

回答

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 
+0

感謝您的解決方案和建議。只是修改了查詢以刪除您提供的評論。這是一個很好的解決方案。再次感謝 – Bujji