我应该如何在 MySQL 中使用 NOT IN 语句

Posted

技术标签:

【中文标题】我应该如何在 MySQL 中使用 NOT IN 语句【英文标题】:How should I use NOT IN statement in MySQL 【发布时间】: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)

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

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

    最后我得到了在 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 从未显示过) 【参考方案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'

【讨论】:

以上是关于我应该如何在 MySQL 中使用 NOT IN 语句的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何审计 MySQL 表中的更改(使用 MySQL 4)?

我应该如何在 MySQL 数据库中存储 ftp 登录凭据?

我应该如何在 mysql 中存储可用性日历信息?对于 [id] [日期] [可用/不可用]

我应该在 MySQL 中为 JSON 使用 blob 还是 text?

我应该如何引用 Web 主机上的 MySQL 服务器?

如何在 MySQL 中使用排他锁?