SQL查询:基于活跃筛选条件统计各标签关联的有效产品数量
标签关联产品计数查询方案
需求说明
现有三张表:产品表products、标签表tags、产品标签关联表productTags,需要基于当前生效的产品筛选条件,查询全量标签列表,同时返回每个标签匹配到的符合筛选条件的产品数量,无匹配时计数为0。
表结构说明
products产品表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 产品主键 |
| name | varchar | 产品名称 |
tags标签表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 标签主键 |
| name | varchar | 标签名称 |
productTags产品标签关联表
| 字段 | 类型 | 说明 |
|---|---|---|
| productId | int | 关联产品ID |
| tagId | int | 关联标签ID |
通用查询SQL
SELECT t.id AS id, t.name AS name, COUNT(DISTINCT valid_p.id) AS productCount FROM tags t -- 关联标签和产品的映射关系 LEFT JOIN productTags pt ON t.id = pt.tagId -- 关联符合当前筛选条件的产品集合 LEFT JOIN ( -- 这里放你当前生效的产品筛选逻辑,返回符合要求的产品ID列表即可 SELECT id FROM products -- 示例筛选条件1:产品名包含指定字符 -- WHERE name LIKE '%Product%' -- 示例筛选条件2:已选中标签3作为筛选条件 -- WHERE id IN (SELECT productId FROM productTags WHERE tagId = 3) ) valid_p ON pt.productId = valid_p.id -- 按标签分组统计 GROUP BY t.id, t.name ORDER BY t.id ASC;
结果说明
如果不需要任何额外筛选,直接去掉valid_p子查询里的WHERE条件即可,此时返回的基础结果为:
| id | name | productCount |
|---|---|---|
| 1 | Tag1 | 3 |
| 2 | Tag 2 | 2 |
| 3 | Tag 3 | 1 |
如果你示例中的Tag2计数为0,只需要在valid_p子查询里添加对应的过滤规则,比如排除所有关联了Tag2的产品即可。
注意事项
- 所有产品筛选逻辑都放到内层
valid_p子查询中,不要写到外层WHERE条件中,否则会导致匹配数为0的标签被过滤掉 - 用
COUNT(DISTINCT valid_p.id)可以避免关联表重复数据导致的计数错误
内容的提问来源于stack exchange,提问作者JJaun
相关产品推荐
相关产品推荐

