2012-05-30 58 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;