You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询求助:找出表A中当前月份未在表B出现的ID

解决MySQL查询:找出表A中未出现在表B指定月份的ID

我来帮你分析问题并给出正确的查询语句,先看看你之前尝试的查询哪里出了问题:

你的查询问题分析

  1. 第一个查询 SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL and B.month=(current date)
    这里的核心逻辑错误是:当你用LEFT JOIN时,表A中没有匹配表B的记录会导致表B的所有字段都是NULL。这时候B.month=(current date)这个条件会直接过滤掉这些NULL的记录(因为NULL和任何值比较都不成立),所以这个查询根本返回不了你要的结果。

  2. 第二个查询的思路是对的(先筛选表B的当前月份记录,再和表A左连接),但问题出在当前月份的获取语法上——MySQL里没有current month这种写法,得用正确的函数来获取当前月份。

正确的查询语句

根据你的需求,分两种场景给出解决方案:

场景1:获取表A中所有未出现在表B当前月份记录的ID

如果表B的Month字段存的是英文月份名(比如你的示例里的March、April),用下面的语句:

SELECT A.id
FROM A
LEFT JOIN (
    SELECT id 
    FROM B 
    WHERE Month = DATE_FORMAT(CURDATE(), '%M')
) AS B_current_month ON A.id = B_current_month.id
WHERE B_current_month.id IS NULL;

如果Month字段存的是数字(比如3代表三月,4代表四月),就换成MONTH(CURDATE())获取当前月份数字:

SELECT A.id
FROM A
LEFT JOIN (
    SELECT id 
    FROM B 
    WHERE Month = MONTH(CURDATE())
) AS B_current_month ON A.id = B_current_month.id
WHERE B_current_month.id IS NULL;

场景2:只获取表A中在表B有过其他月份记录,但四月没有的ID(匹配你的期望结果)

你的示例期望结果是1、2,看起来你只关心那些已经在表B有过记录(比如三月付过费)但四月没付的ID。这种情况可以用NOT IN来实现:

SELECT A.id
FROM A
WHERE A.id IN (SELECT id FROM B) -- 确保该ID在表B存在过历史记录
AND A.id NOT IN (SELECT id FROM B WHERE Month = 'April');

如果是匹配当前月份,把'April'换成对应的日期函数即可。

额外说明

如果是要固定匹配四月(不是动态的当前月份),直接把条件写成Month = 'April'(英文名称)或者Month = 4(数字)就可以,这样更直观。

内容的提问来源于stack exchange,提问作者Muhammad Ahmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:23:06