You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

标签系统过滤场景下给定标签集合的标签使用次数统计问询

优化后的标签统计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;

方案优势

  1. 避免冗余操作:用LEFT JOIN直接关联标签表和符合条件的项标签关联,无需用UNION拼接结果再去重,逻辑更清晰,执行效率更高。
  2. 自然返回0次标签:通过COUNT(it.IDitem)统计(而非COUNT(*)),利用LEFT JOIN中无匹配行时it.IDitem为NULL的特性,自动将未在符合条件项中出现的标签计数设为0。
  3. 子查询简化:子查询直接基于item_tags表筛选符合条件的项,无需关联tags表(已知标签ID的情况下),进一步提升查询性能。
  4. 严谨性保障:使用COUNT(DISTINCT IDtag)确保项确实包含所有选中的标签(避免同一标签重复绑定到项的情况影响判断)。

示例验证

以你提供的测试数据为例,当选中food(1)和drink(3)时:

  • 子查询会筛选出同时包含这两个标签的项(ID=2和ID=5)
  • 最终统计结果为:
    IDnamecount
    1food2
    2fruit0
    3drink2
    4absurdly_sweet1
    5car0

完全符合你示例中food[2]、fruit[0]的预期结果。

内容的提问来源于stack exchange,提问作者crueltear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:08:13