MySql 查询优化,用 join 替换 not in subquery

标签 mysql subquery

我有一个查询,我觉得它非常庞大,可以进行优化。第一件事显然是用 join 替换 not in subquery 但它会影响我拥有的 sub-sub 查询。我会很感激关于它的建议/解决方法。

这是查询

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

最佳答案

您可以通过 INNER JOIN 轻松地将 2 个内部子查询组合在一起。对于外部,您应该使用 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;

关于MySql 查询优化,用 join 替换 not in subquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10813966/

相关文章:

mysql - PhpMyAdmin:如何找到父表中丢失的外键?

php - 在MYSQL SELECT中连接PHP变量

php - 子选择或子查询

MySQL:具有多个结果的子查询

mysql查询返回具有某一列的MAX值的记录

MySQL:规范化内容类型、类别和子类别

php - 使用表 B 中的信息更新表 A(其中包含重复信息)

Mysql:何时在主服务器上的二进制日志中记录一个事件

sql - 在 WHERE 谓词解决方法中配置多个子查询

mysql - 如何避免执行子查询?