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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:39:03