多模型共通子项查询:实现IN语句反向的动态AND逻辑
查询多个父模型共有的子项(IN的反向AND逻辑)
嘿,我来帮你搞定这个需求——要找出多个父模型共有的所有子项,本质就是把IN的OR逻辑换成AND,这其实是个很经典的分组统计场景,直接给你上可落地的SQL方案:
核心SQL示例(直接用模型ID查询)
假设你要找modelId为1、2、3的三个模型共同拥有的子项,SQL可以这么写:
SELECT i.* FROM Items i JOIN ItemsInModel iim ON i.id = iim.itemId WHERE iim.modelId IN (1, 2, 3) GROUP BY i.id, i.name -- 这里要包含Items表中所有你需要返回的字段,或者根据数据库特性调整(比如PostgreSQL仅需GROUP BY主键i.id) HAVING COUNT(DISTINCT iim.modelId) = 3;
逻辑拆解
- 第一步:通过
JOIN关联子项表和中间关联表,先获取所有属于目标模型的子项关联记录 - 第二步:用
WHERE IN筛选出目标模型的关联数据(这一步还是OR逻辑,但只是缩小范围) - 第三步:按子项ID分组,统计每个子项关联的不同模型数量
- 第四步:通过
HAVING条件要求统计数量等于目标模型的总数——只有同时属于所有目标模型的子项,才会满足这个条件
优化与扩展点
- 如果你的
ItemsInModel表不会出现同一个子项重复关联同一个模型的情况(也就是(itemId, modelId)是唯一键),可以去掉DISTINCT,直接用COUNT(iim.modelId) = 3,性能会更好 - 如果你是通过模型名称来查询,而不是模型ID,可以多关联一层
Models表:
SELECT i.* FROM Items i JOIN ItemsInModel iim ON i.id = iim.itemId JOIN Models m ON m.id = iim.modelId WHERE m.modelName IN ('订单模型', '库存模型') GROUP BY i.id HAVING COUNT(DISTINCT m.id) = 2;
- 动态场景下(比如前端传入不确定数量的模型ID),只需要动态生成
IN里的参数列表,同时把HAVING里的数字改成参数的数量就行
内容的提问来源于stack exchange,提问作者JimmyD
相关产品推荐
相关产品推荐

