MySQL如何从tbl1或tbl2中查询指定subscriptionid的数据?
正确查询写法及原语句问题分析
原查询的问题
- 用逗号关联
tbl1和tbl2会生成笛卡尔积,也就是两个表的所有记录两两组合,结果完全不符合你查找指定subscriptionid的需求 (tbl1.subscriptionid OR tbl2.subscriptionid) = 'some_val'的逻辑完全错误:SQL中OR的优先级低于等于号,实际执行逻辑是先判断tbl1.subscriptionid是否为“真”(非空且非0)、tbl2.subscriptionid是否为“真”,再把这两个布尔值的OR结果和字符串'some_val'比较,这根本不是你要的“任一表的subscriptionid等于指定值”的逻辑
正确的查询语句
因为subscriptionid仅存在于其中一个表或为null,你需要分别查询两个表中符合条件的记录,再用UNION合并结果:
SELECT id, userid, subscriptionid, column2, column3, NULL AS column4, NULL AS column5, NULL AS column6, NULL AS column7 FROM tbl1 WHERE subscriptionid = 'some_val' UNION SELECT id, userid, subscriptionid, NULL AS column2, NULL AS column3, column4, column5, column6, column7 FROM tbl2 WHERE subscriptionid = 'some_val';
补充说明
UNION会自动去重(由于subscriptionid唯一,这里去重不会影响结果),如果不需要去重可以用UNION ALL,执行效率更高- 两个表列数、列名不完全一致,需要用
NULL AS 列名补全缺失列,保证结果集结构统一 - 如果需要包含
subscriptionid为null的记录,只需把WHERE条件改为subscriptionid = 'some_val' OR subscriptionid IS NULL即可
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

