mysql - 子查询不适合左连接替代方案?

标签 mysql

我有这样的查询

SELECT  f.ACCOUNT_ID,
        f.TGL,
        p.ACCOUNT_EMAILADDRESS


     FROM distributor_kokola.forecast f
      inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
      where f.ACCOUNT_ID NOT IN(

                 select ACCOUNT_ID
                        from distributor_kokola.forecast
                         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")  
                         group by ACCOUNT_ID


    )

      group by f.ACCOUNT_ID;

该子查询可以工作,但速度很慢,所以我用 Left Join 更改它,它工作得更快

SELECT  f.ACCOUNT_ID,
        f.TGL,
        p.ACCOUNT_EMAILADDRESS


     FROM distributor_kokola.forecast f
       left  join(

                 select ACCOUNT_ID
                        from distributor_kokola.forecast
                         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")  
                         group by ACCOUNT_ID


    )subb on subb.ACCOUNT_ID = f.ACCOUNT_ID

       inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
      group by f.ACCOUNT_ID;

但是,我的问题是仍然包含错误的结果,

对于 Not IN,查询 1 选择 NOT IN 查询 2 的位置。

我怎样才能得到像 NOT IN 带有左连接的查询。

有人可以帮助我吗?

谢谢。

最佳答案

您必须添加一个 WHERE 子句来按 LEFT JOIN 的结果进行过滤。如果您添加适当的 WHERE 子句 WHERE subb.ACCOUNT_ID IS NULL,它应该按预期工作(因为您在子查询中使用了 GROUP BY,所以不存在重复行的危险):

SELECT  f.ACCOUNT_ID,
        f.TGL,
        p.ACCOUNT_EMAILADDRESS
     FROM distributor_kokola.forecast f
       left  join(
                 select ACCOUNT_ID
                        from distributor_kokola.forecast
                         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")  
                         group by ACCOUNT_ID
    )  subb on subb.ACCOUNT_ID = f.ACCOUNT_ID
       inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
      WHERE sub.ACCOUNT_ID IS NULL
      group by f.ACCOUNT_ID;

更新

LEFT JOIN 的目标是查找 forecast 表中在子查询中没有匹配行的所有行。因此,我们需要一个 WHERE 子句来删除具有匹配行的所有行 - WHERE sub.ACCOUNT_ID IS NULL 非常适合。

SO 用户 @quassnoi 写了 wonderful comparison of different methods来实现这个目标。

关于mysql - 子查询不适合左连接替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46724972/

相关文章:

php - If 语句在 PHP session 和 SQL 中无法按预期工作

mysql - 查找 MySQL 中每个人发送的消息数

mysql - 复合外键添加失败

MySQL LEFT JOIN 优化

Mysql 5.7 st_distance_sphere 每次返回null

mysql - 南迁移错误,InnoDB : ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope

mysql - 使用结果集更新角色击杀和死亡

mysql - 获取 MySQL 数据库中所有表的记录数

mysql - Golang mysql 客户端 DB.Query 方法不重新编码 utf-8 编码的字符

php - 授予mysql远程访问权限