我应该如何在 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 < 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 < '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 中存储可用性日历信息?对于 [id] [日期] [可用/不可用]