MySQL:如何在第二表无匹配行时选取第一表的对应记录
数据库查询解决方案:找出表1中无匹配表2同number行的记录
嘿,咱们先把需求理清楚:要从表1里挑出这样的行——针对该行的number,表2里所有相同number的行,name都和表1这行的name不一样。结合你给的例子,表1里number=124、name=asd的行,表2里同number的行name都是rrr和asx,完全不匹配,所以这行就是我们要找的。
下面给你两种实用的SQL实现方式,都能满足需求:
方法1:用NOT EXISTS子查询(推荐,性能友好)
这是最直观的写法,直接检查“表2里有没有和当前表1行number、name都匹配的记录”,如果没有就选中该行:
SELECT t1.number, t1.name FROM table1 t1 WHERE NOT EXISTS ( SELECT 1 FROM table2 t2 WHERE t2.number = t1.number AND t2.name = t1.name );
咱们对应例子验证一下:
- 表1中number=123、name=asd的行:表2里存在同number且name相同的记录,所以
NOT EXISTS条件不成立,不会被选中; - 表1中number=124、name=asd的行:表2里同number的行没有name=asd的,
NOT EXISTS条件成立,会被选中,输出就是你想要的124, asd。
方法2:用LEFT JOIN + GROUP BY统计
另一种思路是通过关联表,统计匹配的记录数,没有匹配的就选中:
SELECT t1.number, t1.name FROM table1 t1 LEFT JOIN table2 t2 ON t1.number = t2.number AND t1.name = t2.name GROUP BY t1.number, t1.name HAVING COUNT(t2.id) = 0;
解释一下:把表1和表2按number和name关联,分组后统计表2的记录数。如果计数为0,说明表2里没有任何匹配的行,也就是同number的所有行都和表1这行的name不匹配,符合需求。
如果你的表数据量比较大,给表2的number和name字段加个联合索引,能让查询速度更快哦!
内容的提问来源于stack exchange,提问作者A.Dias
相关产品推荐
相关产品推荐

