SQL关联查询与IN子查询返回空结果,求技术排查建议
嘿,咱们来好好排查下这个有点费解的SQL问题:你的两个关联查询都返回空结果,但单独查各个部分都有数据。一步步来分析:
排查步骤
1. 验证目标屏幕是否真的有对应的短信记录
你的验证信息显示:
- 所有
sms的screen_id都能在screens表中找到(SELECT id FROM sms WHERE screen_id IN (SELECT id FROM screens)返回全量数据) - 确实存在
experience_id=108的屏幕记录(SELECT id FROM screens WHERE experience_id = 108有结果)
那核心疑问就是:这些experience_id=108的屏幕,到底有没有对应的sms记录?执行这条SQL就能直接确认:
SELECT s.id AS screen_id, sm.id AS sms_id FROM screens s LEFT JOIN sms sm ON s.id = sm.screen_id WHERE s.experience_id = 108;
如果结果里的sms_id全是NULL,那说明这些屏幕根本没有关联的短信——这时候你的原始查询返回空是完全正常的,可能是你误以为有对应数据,或者数据录入环节出了问题。
2. 排除隐式类型转换的潜在问题
你的第一个查询里用了字符串'108'作为experience_id的条件,虽然MySQL会自动做隐式转换,但为了彻底排除这个因素,你可以把第一个查询改成和第二个一致的数字形式再试一次:
SELECT sms.id FROM sms INNER JOIN screens ON sms.screen_id = screens.id WHERE screens.experience_id = 108;
不过你提到第二个查询也返回空,所以这个步骤更多是确认问题不在类型转换上。
3. 检查数据一致性(如果第一步发现有对应记录但查询不到)
如果第一步的结果里有部分sms_id不为空,但你的原始查询还是返回空,那就要排查数据是否存在异常:
- 检查
screens表中experience_id=108的id是否有非整数的异常值?虽然表结构定义是int(11),但有没有可能通过特殊操作插入了非数字内容? - 查看
sms表的screen_id是否包含空格或隐藏字符?可以用十六进制对比来确认:
如果十六进制值不一致,说明数据存在隐藏的格式问题。-- 查看sms的screen_id十六进制值 SELECT screen_id, HEX(screen_id) FROM sms; -- 查看目标屏幕的id十六进制值 SELECT id, HEX(id) FROM screens WHERE experience_id=108;
总结
最大概率的原因是:experience_id=108的屏幕记录并没有对应的sms数据。通过第一步的左连接查询就能快速验证这一点。如果确实存在对应数据但查询不到,再进一步排查数据一致性的问题。
内容的提问来源于stack exchange,提问作者Gav O'Healaigh
相关产品推荐
相关产品推荐

