SQL如何从单表中查询满足多属性组合匹配条件的记录
查询方案解答
- 无需使用自连接即可实现需求,查询完全基于标准
SELECT ... FROM ... WHERE结构编写,后续扩展匹配规则的维护成本极低。 - WHERE子句中需要配置所有单条属性的匹配规则,用来提前过滤无关数据,提升查询效率。
实现逻辑
针对这类实体-属性-值(EAV)结构表的多属性同时匹配场景,最易扩展的方案是条件聚合方案,核心逻辑分两步:
- 在WHERE阶段通过OR连接所有单个属性匹配规则,只捞取命中任意一条规则的记录,缩小计算范围
- 按
Warehouse_ID分组,统计每个仓库命中的不重复属性规则数量,仅保留命中数等于规则总条数的仓库即可
可直接运行的示例代码
SELECT Warehouse_ID FROM warehouse_attributes -- 替换为你的实际表名 WHERE -- 所有匹配规则统一写在这里,新增规则只需要追加OR条件即可 (Attribute_ID = 101 AND Value = 'Red') OR (Attribute_ID = 201 AND Value = 'XXL') -- 扩展示例:如果要加"属性301值为Cotton"的规则,直接在下一行追加 OR (Attribute_ID = 301 AND Value = 'Cotton') GROUP BY Warehouse_ID -- 等号后的数字和你配置的规则总数保持一致即可,比如加了1条新规则就改成3 HAVING COUNT(DISTINCT CONCAT(Attribute_ID, ':', Value)) = 2;
注:用CONCAT(Attribute_ID, ':', Value)做去重统计,是为了避免同个仓库下出现多条同ID同值的重复记录导致计数不准;如果你表中同一个Warehouse_ID不会有重复的Attribute_ID+Value组合,也可以直接写COUNT(*) = 2简化写法。
效果验证
基于你给出的示例数据:
- W01命中两条规则,计数为2,会被返回
- W25的Attribute_ID=101对应值为Blue、Attribute_ID=201对应值为M,没有命中配置的规则,计数为0,会被过滤
完全符合预期返回要求。
内容的提问来源于stack exchange,提问作者Piotr Nazim
相关产品推荐
相关产品推荐

