【问题标题】:MySQL "NOT IN" unexpected behavior when LEFT JOIN WITH null results当 LEFT JOIN WITH null 结果时,MySQL“不在”意外行为
【发布时间】:2020-07-13 10:23:12
【问题描述】:

我有一个应用程序,它接收一个对象并生成一个用于收集报告数据的动态查询。该对象包含最终转换为 MySQL 中的“WHERE”语句的过滤器属性。 生成的查询的更简单和主题版本如下所示:

 SELECT cr3.id AS col_1, 
 count(table1.ids) AS col_2 
 FROM table1 
 LEFT JOIN table2 cr3 ON table1.id = cr3.Id
 WHERE cr3.id NOT IN ('val') GROUP BY 1;

查询的数据库有这个数据集(没有应用任何过滤):

| col_1 | col_2 |
| null  | 100   |
| val   | 100   |

执行时结果集为空。我应该得到数据集的第一行:

| null | 100 |

如果我从那里调整 WHERE 子句

WHERE cr3.id NOT IN ('val') => WHERE (cr3.id NOT IN ('val') OR cr3.id IS NULL)

我收到了预期的结果,但这是针对不同类型的查询动态生成的,无论如何我都无法调整“NOT IN”运算符以获得正确的行为并返回与指定内容不匹配的所有内容一个论点。

有什么想法吗?

【问题讨论】:

  • 阅读有关 IN 工作原理的手册,特别是它如何处理 NULL。此外,您的目标和重写和替换 IN 是常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。了解如何改用 EXISTS。 “有任何想法吗 ?”不是一个有效的问题。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: mysql left-join notin


【解决方案1】:

您可以在加入前过滤table2

SELECT t2.id AS col_1, COUNT(t1.id) AS col_2 
FROM table1 t1 
LEFT JOIN (SELECT * FROM table2 WHERE id NOT IN ('val')) AS t2 
ON t2.id = t1.id
GROUP BY t2.id;

【讨论】:

    【解决方案2】:

    我看到有很多选项可以获得预期的结果,但我正在寻找的解决方案可以很容易地应用在这个动态环境中,并且不会更改遵循 WHERE 过滤的语句,在这种情况下是最佳解决方案我发现使用这样的 COALESCE 函数调用增强了过滤部分:

     SELECT cr3.id AS col_1, 
     count(table1.ids) AS col_2 
     FROM table1 
     LEFT JOIN table2 cr3 ON table1.id = cr3.Id
     WHERE COALESCE(cr3.id, '') NOT IN ('val') GROUP BY 1;
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多