2012-05-30 93 views
1

我有一個查詢,我覺得是非常笨重,可以做與優化。第一件事顯然是用聯接替換而不是子查詢,但它會影響我有的子子查詢。我會很感激它的建議/解決方法。MySql查詢優化,取代不在子查詢加入

這是查詢

SELECT * 
FROM lastweeksales 
WHERE productID = 1234 
AND retailer NOT 
IN (
    SELECT retailer 
    FROM sales 
    WHERE productID 
    IN (
     SELECT productID 
     FROM products 
     WHERE publisher = 123 
    ) 
    AND DATE = date(now()) 
) 

基本上,我想要得到的產物,其中零售商不存在是沒有銷售,但今天的銷售只應在產品上受到了一定出版商從過去一週的銷售行。

:S:S:S

+0

儘量不要使用'NOT IN'或'IN'因爲lastweeksales每一行都會項目,具有性能較差的子表。嘗試使用連接來獲得你想要的數據 – Neo

+0

@Neo這不正是他所要求的嗎? –

回答

1

您可以組一起2級內的子查詢容易經由INNER JOIN。對於外部,你應該用LEFT OUTER加入,然後過濾的retailer IS NULL,像這樣:

SELECT lws.* 
    FROM lastweeksales lws 
    LEFT JOIN (SELECT s.retailer 
       FROM sales s 
       JOIN products p USING (productID) 
       WHERE p.publisher = 123 
       AND s.date = date(now())) AS r 
     ON lws.retailer = r.retailer 
WHERE r.retailer IS NULL;