MySQL如何从两个含userid列的表中查询匹配的共同数据
两表共有匹配userid的查询实现方案
你要的结果本质是取两个表同时存在的userid交集,考虑到当前两个表都只有userid单列、没有其他业务字段的简单结构,完全可以根据所用数据库、数据量大小选下面的实现方案:
- 全数据库通用写法:内连接(INNER JOIN)
这个写法是所有数据库都支持的通用方案,后续如果两表加了其他要关联查询的字段,几乎不用改关联逻辑就能直接扩展。
对应SQL代码:
补充:如果两表的userid字段本身就没有重复值,直接去掉-- 把table1、table2换成你实际的表名就行 SELECT DISTINCT t1.userid FROM table1 t1 INNER JOIN table2 t2 ON t1.userid = t2.userid;DISTINCT关键字,跑出来的结果完全一样。 - 最精简写法:SQL标准交集(INTERSECT)
针对现在只取共有值的单列场景,这个语法写起来最省事,还会自动给结果去重,不用额外写去重逻辑。
对应SQL代码:
补充:这是SQL官方标准语法,PostgreSQL、Oracle、SQL Server都原生支持;注意MySQL是从8.0.31版本才开始兼容这个语法,更低的MySQL版本跑不了。SELECT userid FROM table1 INTERSECT SELECT userid FROM table2; - 大表高效写法:EXISTS子查询
要是两表数据量很大、且userid字段建了索引,用这个写法的查询速度更快,不用做跨表的全匹配扫描,逻辑更轻。
对应SQL代码:
补充:如果外层查询的那张表里userid没有重复值,这个写法连去重逻辑都不用加,直接就能精准返回所有匹配的共有userid。SELECT t1.userid FROM table1 t1 WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t2.userid = t1.userid );
注意:上面所有写法默认返回的是去重后的匹配userid;要是你需要保留两表里的重复条目(比如要统计匹配到的userid在各表的原始出现次数),把语句里的去重逻辑删掉、保留所有匹配的原始行就行。
内容的提问来源于stack exchange,提问作者Mohammed Yahya
相关产品推荐
相关产品推荐

