标签系统过滤场景下给定标签集合的标签使用次数统计问询
优化后的标签统计SQL方案
针对你需要统计**符合过滤条件的项中所有标签使用次数(含次数为0的标签)**的需求,这里提供一个更简洁高效的SQL方案,替代你当前的UNION+GROUP BY实现:
核心查询代码
-- 替换括号中的标签ID为用户实际选中的标签ID,同时修改HAVING后的数字为选中标签的数量 SELECT t.ID, t.name, COUNT(it.IDitem) AS `count` FROM tags t LEFT JOIN item_tags it ON t.ID = it.IDtag AND it.IDitem IN ( -- 子查询:筛选出包含所有选中标签的项 SELECT IDitem FROM item_tags WHERE IDtag IN (1, 3) -- 示例:选中food(1)和drink(3) GROUP BY IDitem HAVING COUNT(DISTINCT IDtag) = 2 -- 选中标签的数量,需与IN中的数量一致 ) GROUP BY t.ID, t.name ORDER BY t.ID;
方案优势
- 避免冗余操作:用
LEFT JOIN直接关联标签表和符合条件的项标签关联,无需用UNION拼接结果再去重,逻辑更清晰,执行效率更高。 - 自然返回0次标签:通过
COUNT(it.IDitem)统计(而非COUNT(*)),利用LEFT JOIN中无匹配行时it.IDitem为NULL的特性,自动将未在符合条件项中出现的标签计数设为0。 - 子查询简化:子查询直接基于
item_tags表筛选符合条件的项,无需关联tags表(已知标签ID的情况下),进一步提升查询性能。 - 严谨性保障:使用
COUNT(DISTINCT IDtag)确保项确实包含所有选中的标签(避免同一标签重复绑定到项的情况影响判断)。
示例验证
以你提供的测试数据为例,当选中food(1)和drink(3)时:
- 子查询会筛选出同时包含这两个标签的项(ID=2和ID=5)
- 最终统计结果为:
ID name count 1 food 2 2 fruit 0 3 drink 2 4 absurdly_sweet 1 5 car 0
完全符合你示例中food[2]、fruit[0]的预期结果。
内容的提问来源于stack exchange,提问作者crueltear
相关产品推荐
相关产品推荐

