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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:29