SQLite如何查询满足特定条件的ID列表?
看起来你是想拿到符合特定条件的ID列表,但原查询可能没达到你预期的效果——我来帮你拆解问题,给出对应的解决方案:
首先得明确你的核心需求,因为不同需求的解决方式差异很大:
需求1:只要ID有至少一行符合条件,就列出这个ID(允许ID存在其他不符合条件的行)
你的原查询会返回所有满足(key != 60) OR (key = 60 AND value = 8)的行,但如果要得到唯一的ID列表,只需要加上DISTINCT关键字去重即可:
SELECT DISTINCT id FROM items_attributes WHERE (key != 60) OR (key = 60 AND value = 8);
这个查询会把所有存在符合条件行的ID列出来,每个ID仅出现一次。
需求2:ID的所有行都符合条件(排除存在key=60且value≠8行的ID)
如果你的真实需求是:某个ID下的每一行都必须满足条件——也就是说,只要ID有一行是key=60且value≠8,就直接排除这个ID,那原查询就不合适了(它会把该ID的其他符合条件的行也查出来,导致ID被误包含)。
这种情况可以用两种方法实现:
方法一:分组统计过滤
通过GROUP BY对ID分组,统计不符合条件的行数,只要行数为0,说明该ID的所有行都符合要求:
SELECT id FROM items_attributes GROUP BY id HAVING SUM(CASE WHEN key = 60 AND value != 8 THEN 1 ELSE 0 END) = 0;
方法二:用NOT EXISTS子查询
直接筛选出不存在key=60且value≠8行的ID,逻辑更直观:
SELECT DISTINCT id FROM items_attributes ia WHERE NOT EXISTS ( SELECT 1 FROM items_attributes WHERE id = ia.id AND key = 60 AND value != 8 );
用你的测试数据验证的话,这两个查询会返回244574、218965、218966三个ID,排除掉存在不符合条件行的214808和214809,这也是大多数场景下的预期结果。
内容的提问来源于stack exchange,提问作者Andreas B
相关产品推荐
相关产品推荐

