如何编写SQL查询选出包含指定全部标签的Entries表记录
原语句问题
- 缺少Entries和Tags表的关联条件,会生成笛卡尔积,返回大量无效关联结果
IN条件只能匹配持有任意一个目标标签的条目,无法筛选出同时持有全部目标标签的条目
前置说明
默认Tags表包含entry_id外键字段,关联Entries表的id字段(这是标签多对多关联的标准设计,若无该关联字段两张表无法完成关联查询)
通用查询方案(兼容所有主流关系型数据库)
使用关联+分组聚合的方式实现:
SELECT e.id, e.name FROM entries e INNER JOIN tags t ON e.id = t.entry_id WHERE t.tag IN ('tag1', 'tag2', 'tag3') -- 替换为你的目标标签列表 GROUP BY e.id, e.name HAVING COUNT(DISTINCT t.tag) = 3; -- 此处数值等于目标标签的总个数
方案说明
WHERE子句先过滤出所有匹配到任意一个目标标签的关联记录- 按Entries表的主键分组,统计每个条目匹配到的不重复标签数量
- 只有统计数量等于目标标签总数的条目,才满足同时持有全部目标标签的要求
- 若Tags表中同一个条目不会重复添加相同标签,可将
COUNT(DISTINCT t.tag)简化为COUNT(*),查询性能更好
小数量标签适配方案
如果目标标签数量较少,可以用多次EXISTS子查询实现,性能更优:
SELECT e.id, e.name FROM entries e WHERE EXISTS (SELECT 1 FROM tags t WHERE t.entry_id = e.id AND t.tag = 'tag1') AND EXISTS (SELECT 1 FROM tags t WHERE t.entry_id = e.id AND t.tag = 'tag2') AND EXISTS (SELECT 1 FROM tags t WHERE t.entry_id = e.id AND t.tag = 'tag3');
内容的提问来源于stack exchange,提问作者flying_loaf_3
相关产品推荐
相关产品推荐

