编写MySQL语句查询与指定tag_name无关联的field_name
MySQL查询未关联指定标签的字段名实现方案
前提表结构
- 字段表(表1):包含
ID、FIELD_NAME两个字段,存储映射关系:ID=1对应field_1、ID=2对应field_2、ID=3对应field_3 - 标签表(表2):包含
ID、TAG_NAME两个字段,存储映射关系:ID=1对应tag_1、ID=2对应tag_2、ID=3对应tag_3、ID=4对应tag_4 - 关联表(表3):包含
FIELD_ID、TAG_ID两个字段,存储字段和标签的绑定关系:field_1关联tag_1/tag_2/tag_3,field_2关联tag_1,field_3关联tag_2/tag_3
实现逻辑
先获取指定标签名称对应的标签ID,再排除所有和该标签ID有关联关系的字段,剩下的字段即为所求结果。
可用查询语句
方案1:NOT IN子查询写法(逻辑易懂,适合小数据量场景)
SELECT f.FIELD_NAME FROM 表1 f WHERE f.ID NOT IN ( SELECT r.FIELD_ID FROM 表3 r INNER JOIN 表2 t ON r.TAG_ID = t.ID WHERE t.TAG_NAME = '输入要查询的标签名' );
测试验证:
- 输入标签名
tag_1时,返回结果为field_3,符合需求 - 输入标签名
tag_4时,子查询返回空集合,最终返回所有字段field_1/field_2/field_3,符合需求
方案2:LEFT JOIN写法(关联查询性能更优,适合大数据量场景)
SELECT f.FIELD_NAME FROM 表1 f CROSS JOIN 表2 t LEFT JOIN 表3 r ON f.ID = r.FIELD_ID AND t.ID = r.TAG_ID WHERE t.TAG_NAME = '输入要查询的标签名' AND r.FIELD_ID IS NULL;
提示:如果三张表有实际业务命名,将语句中的
表1/表2/表3替换为实际表名即可执行。
内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

