网页过滤器SQL查询问题:筛选拥有指定属性且isPresent=1的书籍
书籍属性过滤的SQL查询解决方案
你的核心需求是:筛选出**至少拥有Attr1或Attr2其中一个属性(对应isPresent=1)**的书籍(即示例中的Book1、Book3),排除Book2这类两个目标属性都不满足的情况。下面是几种可行的实现方式:
方法1:GROUP BY + HAVING 聚合筛选
SELECT book FROM books WHERE attr IN ('Attr1', 'Attr2') GROUP BY book HAVING SUM(isPresent) > 0;
- 逻辑:先过滤出仅包含Attr1和Attr2的记录,按书籍分组后,
SUM(isPresent)大于0说明该书籍至少有一个目标属性的isPresent为1,符合筛选条件。
方法2:EXISTS 子查询验证
SELECT DISTINCT book FROM books b WHERE EXISTS ( SELECT 1 FROM books WHERE book = b.book AND attr IN ('Attr1', 'Attr2') AND isPresent = 1 );
- 逻辑:遍历每本书,通过子查询检查该书籍是否存在一条Attr1/Attr2且isPresent=1的记录,存在则保留;
DISTINCT确保结果中书籍名称不重复。
方法3:IN 子查询匹配
SELECT DISTINCT book FROM books WHERE book IN ( SELECT book FROM books WHERE attr IN ('Attr1', 'Attr2') AND isPresent = 1 );
- 逻辑:子查询先得到所有满足“Attr1/Attr2且isPresent=1”的书籍列表,外层查询返回这些书籍的去重结果。
关于原查询的问题
你提供的原查询SELECT * FROM books WHERE isPresent = 1 && attr IN (Attr1, Attr2)本身不会返回Book2的记录(Book2的Attr1和Attr2的isPresent均为0),但它返回的是符合条件的行记录而非去重后的书籍列表。如果你的目标是获取书籍名称列表,需要调整逻辑确保只保留至少有一个目标属性满足条件的书籍。
内容的提问来源于stack exchange,提问作者MrSully
相关产品推荐
相关产品推荐

