Postgres如何按指定type的多对多关联分类计数筛选games表记录
解法
最小改动方案(基于你现有语句扩展)
你只需要在子查询中关联categories表,增加type过滤条件即可,修改后的语句如下:
SELECT * FROM games WHERE id IN ( SELECT gc.game_id FROM game_category gc -- 关联分类表拿到type字段 JOIN categories c ON gc.category_id = c.id -- 过滤你需要的指定type值,替换成实际的目标值即可 WHERE c.type = '你要的目标type值' GROUP BY gc.game_id -- 这里的5替换成你要的阈值x即可 HAVING COUNT(*) >= 5 )
逻辑说明:
- 子查询先关联关联表
game_category和分类表categories,过滤出所有符合指定type的分类关联记录 - 按游戏ID分组后统计每个游戏符合条件的分类数量,筛选出数量达标的游戏ID
- 外层查询直接根据ID匹配拿到对应的游戏记录
扩展场景:同时校验总分类数和指定type分类数
如果你需要同时满足「总关联分类数≥N」+「指定type的分类数≥X」,可以用条件聚合实现,不需要多层子查询:
SELECT * FROM games WHERE id IN ( SELECT gc.game_id FROM game_category gc LEFT JOIN categories c ON gc.category_id = c.id GROUP BY gc.game_id HAVING -- 总关联分类数≥5(对应你原来的逻辑) COUNT(*) >=5 -- 指定type的分类数≥3,可自行修改阈值和type值 AND COUNT(CASE WHEN c.type = '你要的目标type值' THEN 1 END) >=3 )
内容的提问来源于stack exchange,提问作者Mitchel Jager
相关产品推荐
相关产品推荐

