MySQL查询求助:找出表A中当前月份未在表B出现的ID
我来帮你分析问题并给出正确的查询语句,先看看你之前尝试的查询哪里出了问题:
你的查询问题分析
第一个查询
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和任何值比较都不成立),所以这个查询根本返回不了你要的结果。第二个查询的思路是对的(先筛选表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

