MySQL多表查询问题:使用OR条件未获预期结果求助
问题分析与解决方案
你的查询语句存在两个核心问题:
错误使用交叉连接(笛卡尔积)
用逗号连接tab1和tab2会生成两张表的笛卡尔积(所有行的全量组合),这和你“分别从两张表中提取匹配记录”的需求完全不符。当只有tab2存在匹配记录时,tab1没有满足tab1.login='name@yahoo.com' AND tab1.pwd='123'的行,交叉连接后没有符合条件的组合,自然返回空结果。逻辑运算符优先级隐含问题
MySQL中AND的优先级高于OR,你的条件会被自动解析为:(tab1.login='name@yahoo.com' AND tab1.pwd='123') OR (tab2.email='nme@yahoo.com' AND tab2.pwd='123')但交叉连接的本质还是导致了结果不符合预期。
正确写法
你需要用UNION ALL(保留重复记录)或UNION(自动去重)来合并两张表的查询结果,而不是做交叉连接:
场景1:只需要账号和密码字段
SELECT login AS account, pwd FROM tab1 WHERE login='name@yahoo.com' AND pwd='123' UNION ALL SELECT email AS account, pwd FROM tab2 WHERE email='nme@yahoo.com' AND pwd='123';
场景2:需要保留两张表的所有字段
如果两张表的字段数量、顺序和数据类型一致,可以直接合并:
SELECT * FROM tab1 WHERE login='name@yahoo.com' AND pwd='123' UNION ALL SELECT * FROM tab2 WHERE email='nme@yahoo.com' AND pwd='123';
如果两张表结构不同,需要用NULL填充缺失字段,比如tab1有login, pwd, age,tab2有email, pwd, phone:
SELECT login AS account, pwd, age, NULL AS phone FROM tab1 WHERE login='name@yahoo.com' AND pwd='123' UNION ALL SELECT email AS account, pwd, NULL AS age, phone FROM tab2 WHERE email='nme@yahoo.com' AND pwd='123';
内容的提问来源于stack exchange,提问作者Sophy
相关产品推荐
相关产品推荐

