MySQL如何关联cache与main表查询符合条件的cache全字段数据
查询实现方案
你这个场景不需要使用UNION语法,需求本质是筛选cache表中,能通过client、file字段关联到满足target模糊匹配规则的main表记录的所有行,直接用关联查询或存在性判断即可实现,不会出现列数不匹配的问题。
写法1:INNER JOIN 内连接写法(逻辑直观)
通过内连接关联两张表,匹配关联键后加main表的过滤条件,直接查询cache表所有字段即可:
SELECT cache.* FROM cache INNER JOIN main ON cache.client = main.client AND cache.file = main.file WHERE main.target LIKE '%string%';
注意:如果同一个
(client, file)组合在main表中存在多条匹配记录,上述写法可能返回重复的cache行。如果确认(client, file)在main表中是唯一键,或者需要去重,可以加上DISTINCT关键字:SELECT DISTINCT cache.* FROM cache INNER JOIN main ON cache.client = main.client AND cache.file = main.file WHERE main.target LIKE '%string%';
写法2:EXISTS 子查询写法(无重复行问题,性能稳定)
如果担心main表同关联键存在多条记录导致结果重复,优先用EXISTS写法,它只判断是否存在符合条件的关联main记录,不会产生结果重复,不需要额外加去重逻辑:
SELECT cache.* FROM cache WHERE EXISTS ( SELECT 1 FROM main WHERE main.client = cache.client AND main.file = cache.file AND main.target LIKE '%string%' );
逻辑说明
UNION的作用是合并多个SELECT语句的结果集,要求所有查询的列数、对应列的数据类型完全一致。你的需求是仅从cache表取数,main表仅作为过滤条件使用,完全不需要用到UNION逻辑。
内容的提问来源于stack exchange,提问作者Loek van Kooten
相关产品推荐
相关产品推荐

