SQL查询需求:获取符合多属性条件的ProjectNo值
解决EAV结构表多属性匹配的SQL查询问题
针对你这种键值对(EAV)结构的数据表,要筛选出同时满足Manager = "Bob"、Prop1 = "foo"和Prop2 = "bar"的ProjectNo,这里有几种实用的写法:
方法1:GROUP BY + HAVING(最直观的通用写法)
通过分组统计符合条件的属性数量,确保目标项目同时满足所有要求:
SELECT ProjectNo FROM your_table_name WHERE (Property = 'Manager' AND Value = 'Bob') OR (Property = 'Prop1' AND Value = 'foo') OR (Property = 'Prop2' AND Value = 'bar') GROUP BY ProjectNo HAVING COUNT(DISTINCT Property) = 3;
思路说明:
- 先筛选出所有符合单个条件的记录
- 按
ProjectNo分组后,检查分组内的不同属性数量是否等于3(对应我们的3个条件) - 只有同时具备三个指定属性值的项目才会被保留
方法2:自连接写法(条件较多时逻辑更清晰)
把同一张表多次自连接,每次匹配一个属性条件:
SELECT t1.ProjectNo FROM your_table_name t1 JOIN your_table_name t2 ON t1.ProjectNo = t2.ProjectNo JOIN your_table_name t3 ON t1.ProjectNo = t3.ProjectNo WHERE t1.Property = 'Manager' AND t1.Value = 'Bob' AND t2.Property = 'Prop1' AND t2.Value = 'foo' AND t3.Property = 'Prop2' AND t3.Value = 'bar';
思路说明:
- 每个自连接对应一个属性条件,通过
ProjectNo关联同一个项目的不同属性记录 - 最终只有同时满足三个连接条件的
ProjectNo会被筛选出来
方法3:子查询+IN(简洁易懂的写法)
通过多个子查询筛选出符合单个条件的项目,再取交集:
SELECT ProjectNo FROM your_table_name WHERE Property = 'Manager' AND Value = 'Bob' AND ProjectNo IN ( SELECT ProjectNo FROM your_table_name WHERE Property = 'Prop1' AND Value = 'foo' ) AND ProjectNo IN ( SELECT ProjectNo FROM your_table_name WHERE Property = 'Prop2' AND Value = 'bar' );
思路说明:
- 先锁定
Manager为Bob的项目,再从中筛选出同时存在Prop1=foo和Prop2=bar的项目 - 逻辑直白,新手也能快速理解
记得把语句里的your_table_name替换成你实际的表名,这三种方法都能返回预期结果1。
内容的提问来源于stack exchange,提问作者user2701631
相关产品推荐
相关产品推荐

