SQL查询多where条件实现:如何筛选同label_id下符合要求的多property_id数据
问题原因说明
你原写的WHERE条件无法返回结果,是因为单条数据的property_id只能为一个值,不可能同时等于1和2。正确逻辑是先定位同时满足两个属性阈值要求的label_id集合,再取出这些label_id对应的所有符合要求的行。
方案1:子查询关联法(全数据库兼容)
这是兼容性最高的写法,支持所有主流SQL数据库(MySQL5.x/8.x、PostgreSQL、Oracle等):
SELECT t.* FROM label_master t INNER JOIN ( -- 先筛选出同时满足两个条件的label_id SELECT label_id FROM label_master GROUP BY label_id HAVING SUM(CASE WHEN property_id = 1 AND property_value >= 10 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN property_id = 2 AND property_value >= 15 THEN 1 ELSE 0 END) > 0 ) qualified_labels ON t.label_id = qualified_labels.label_id -- 如果只需要返回两个目标property的行就保留下面的过滤,不需要可以删除 WHERE t.property_id IN (1,2)
方案2:窗口函数法(支持MySQL8.0+、PostgreSQL、Oracle等新版本数据库)
如果你的数据库支持窗口函数,也可以用CTE实现,逻辑更直观:
WITH label_check AS ( SELECT *, -- 按label_id分组校验两个条件是否满足 MAX(CASE WHEN property_id = 1 AND property_value >=10 THEN 1 ELSE 0 END) OVER (PARTITION BY label_id) as cond1_pass, MAX(CASE WHEN property_id = 2 AND property_value >=15 THEN 1 ELSE 0 END) OVER (PARTITION BY label_id) as cond2_pass FROM label_master ) SELECT id, label_id, property_id, property_value FROM label_check WHERE cond1_pass = 1 AND cond2_pass = 1 AND property_id IN (1,2)
以上两种写法返回的结果都和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Dhruv Raval
相关产品推荐
相关产品推荐

