【问题标题】:How should I use NOT IN statement in MySQL我应该如何在 MySQL 中使用 NOT IN 语句
【发布时间】:2021-11-02 08:33:32
【问题描述】:

我正在尝试在 MySQL 中使用 NOT IN 语句。但是,我在下面的代码中得到 0 行(没有语法错误)。我确信该语句应该有超过 0 行。我应该调整什么语法?

SELECT DISTINCT member_id
FROM client_payments
INNER JOIN client_purchase_records ON client_purchase_records.id = client_payments.purchase_record_id
WHERE status = 1
AND client_payments.created_at > '2021-10-28 00:00:00'
AND client_payments.created_at < '2021-10-31 23:59:00'
NOT IN(
    SELECT DISTINCT member_id
    FROM client_payments
    INNER JOIN client_purchase_records ON client_purchase_records.id = client_payments.purchase_record_id
    WHERE status = 1
    AND client_payments.created_at > '2020-9-30 00:00:00'
    AND client_payments.created_at < '2021-10-27 23:59:00'
);

两个查询的区别主要是created_at列,我想用周期A(2021-10-28 00:00:00 - 2021-10-31 23:59:00)和周期做“设置差异操作” B(2020-9-30 00:00:00 - 2021-10-27 23:59:00)

  1. 我要查询2020-9-30 00:00:00 - 2021-10-27 23:59:00 期间付款的member_id

  2. 减去在 2021-10-28 00:00:00 - 2021-10-31 23:59:00 期间付款的 member_id

  3. 最后我得到了在 2021-10-28 00:00:00 - 2021-10-31 期间付款但在 2020-9-30 00:00:00 - 2021-10-27 23:59 期间付款的 member_id: 00(新的 member_id 从未显示过)

【问题讨论】:

  • 除非我遗漏了什么,否则您的查询是:“查找与 X 不同的成员”。你想得到什么?
  • 请分享更多细节。你想达到什么目标?您尝试过什么来解决问题?
  • AND x &lt; y NOT IN (SELECT whatever) 错误但语法正确。您没有收到语法错误,是的,但是查询错误。
  • 两个查询的差异主要是关于created_at列,我想做“设置差异操作”,周期为A(2021-10-28 00:00:00 - 2021-10-31 23 :59:00 )和B期(2020-9-30 00:00:00 - 2021-10-27 23:59:00)
  • 1.我想查询在 2020-9-30 00:00:00 - 2021-10-27 23:59:00 期间付款的 member_id 2. 减去在 2021-10-28 00:00:00 - 2021 期间付款的 member_id -10-31 23:59:00 3. 最后我得到了在 2021-10-28 00:00:00 - 2021-10-31 期间付款但在 2020-9-30 00:00:00 - 2021 期间付款的 member_id -10-27 23:59:00(新的 member_id 从未显示过)

标签: mysql notin


【解决方案1】:

没有语法错误

错误在逻辑中。

您的条件,根据运算符优先级添加括号后,看起来像

AND ( (client_payments.created_at < '2021-10-31 23:59:00') NOT IN ( {subquery} ) )

即比较client_payments.created_at &lt; '2021-10-31 23:59:00'(为0、1或NULL)的结果是在子查询输出中搜索,这显然是不合逻辑的。

【讨论】:

    【解决方案2】:

    你大概想说AND member_id NOT IN (...your subquery...);照原样,它使用先前的条件而不是 member_id。

    此外,您似乎想要 >= 和 和 <.>

    我会这样做:

    SELECT member_id
    FROM client_payments
    INNER JOIN client_purchase_records ON client_purchase_records.id = client_payments.purchase_record_id
    WHERE status = 1
    AND client_payments.created_at >= '2021-09-30 00:00:00'
    AND client_payments.created_at <= '2021-10-31 23:59:00'
    GROUP BY member_id
    HAVING MIN(client_payments.created_at) >= '2021-10-28 00:00:00'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2020-06-20
      • 2016-10-02
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多