2015-09-23 37 views
0

我有這個需要很長時間執行的SQL查詢。將多個NOT IN轉換爲LEFT JOIN以提高性能

SELECT DISTINCT p.products_id, 
       p.products_group, 
       p.products_quantity, 
       p.products_length, 
       p.products_price, 
       p.products_height, 
       p.products_width, 
       p.products_weight, 
       p.products_cost, 
       p.products_rmb_cost, 
       p.products_best_rmb, 
       p.products_status, 
       p.products_image, 
       p.products_vendor_code, 
       p.products_date_added, 
       pd.products_name 
FROM products p, 
     products_description pd 
WHERE p.products_id = pd.products_id 
     AND p.products_id NOT IN(SELECT related_products_id 
           FROM products_related 
           WHERE products_id = '93667') 
     AND p.products_id NOT IN(SELECT products_id 
           FROM products_related 
           WHERE related_products_id = '93667') 
     AND p.products_group = '300' 
     AND language_id = 1 
     AND (((pd.products_name LIKE '%emerald%') 
       OR p.products_image LIKE '%emerald%' 
       OR p.products_id LIKE '%emerald%') 
      AND ((pd.products_name LIKE '%square%') 
        OR p.products_image LIKE '%square%' 
        OR p.products_id LIKE '%square%')) 
     AND pd.products_id != '93667' 
ORDER BY p.products_group, 
      p.products_quantity, 
      p.products_id 

我試圖向2轉換NOT IN部分LEFT JOIN的而不是提高性能,但是我雖然性能確實大幅提高,我得到的結果是不一樣的原始查詢。 關於如何正確修改此查詢以使用LEFT JOIN而不是NOT IN的任何建議?

編輯:

這是我嘗試過,但得到錯誤的結果:

SELECT DISTINCT p.products_id, 
       p.products_group, 
       p.products_quantity, 
       p.products_length, 
       p.products_price, 
       p.products_height, 
       p.products_width, 
       p.products_weight, 
       p.products_cost, 
       p.products_rmb_cost, 
       p.products_best_rmb, 
       p.products_status, 
       p.products_image, 
       p.products_vendor_code, 
       p.products_date_added, 
       pd.products_name 
FROM products p, 
     products_description pd 
     LEFT JOIN products_related pr 
       ON pr.products_id = '93667' 
       AND pr.related_products_id = '93667' 
WHERE p.products_id = pd.products_id 
     AND pr.products_id IS NULL 
     AND pr.related_products_id IS NULL 
     AND p.products_group = '300' 
     AND language_id = 1 
     AND (((pd.products_name LIKE '%emerald%') 
       OR p.products_image LIKE '%emerald%' 
       OR p.products_id LIKE '%emerald%') 
      AND ((pd.products_name LIKE '%square%') 
        OR p.products_image LIKE '%square%' 
        OR p.products_id LIKE '%square%')) 
     AND pd.products_id != '93667' 
ORDER BY p.products_group, 
      p.products_quantity, 
      p.products_id 
+1

如果產品ID可以是'翡翠',那麼我有一種感覺,你甚至已經開始了你已經失去了 – Strawberry

+0

@Strawberry哈哈...... :) – CreativeMind

回答

1

下面嘗試轉換查詢到左join-

SELECT DISTINCT p.products_id, 
       p.products_group, 
       p.products_quantity, 
       p.products_length, 
       p.products_price, 
       p.products_height, 
       p.products_width, 
       p.products_weight, 
       p.products_cost, 
       p.products_rmb_cost, 
       p.products_best_rmb, 
       p.products_status, 
       p.products_image, 
       p.products_vendor_code, 
       p.products_date_added, 
       pd.products_name 
FROM products p 
JOIN products_description pd ON p.products_id = pd.products_id 
LEFT JOIN products_related pr1 ON p.products_id=pr1.related_products_id AND pr1.products_id = '93667' 
LEFT JOIN products_related pr2 ON p.products_id=pr2.products_id AND pr2.related_products_id = '93667' 
WHERE p.products_group = '300' 
     AND language_id = 1 
     AND (((pd.products_name LIKE '%emerald%') 
       OR p.products_image LIKE '%emerald%' 
       OR p.products_id LIKE '%emerald%') 
      AND ((pd.products_name LIKE '%square%') 
        OR p.products_image LIKE '%square%' 
        OR p.products_id LIKE '%square%')) 
     AND pd.products_id != '93667' 
     AND pr1.related_products_id IS NULL 
     AND pr2.products_id IS NULL 
ORDER BY p.products_group, 
      p.products_quantity, 
      p.products_id 
+0

別名在你的源頭中失蹤了nal查詢,所以可能會發生衝突,因爲我們正在與名爲products_related的新表一起加入,如果此表中還包含像language_id這樣的相同列,那麼如果出現任何此類類型的錯誤,請使用與p.language_id類似的別名。 –

+0

現在完美的工作!謝謝!! :) – CreativeMind