我需要查找具有两个值的行,例如:
找到所有食谱中必须含有面粉和糖的食谱,但是根据我的查询,我得到所有含糖或面粉的食谱。
这是我的查询:
select recipe_id, ingred_id from ingreds_values where ingred_id in (3,17)
我得到了这个结果
recipe_id| ingred_id
12083 | 3
12083 | 17
2990 | 17
10084 | 17
3046 | 17
5244 | 3
5244 | 17
但我需要得到这个结果:
recipe_id| ingred_id
12083 | 3
12083 | 17
5244 | 3
5244 | 17
答案 0 :(得分:1)
我确信DBA或其他人能够为您创建更优雅的查询,但这样做可以解决问题:
select iv1.recipe_id, iv1.ingred_id, iv2.ingred_id
from
ingreds_values iv1,
ingreds_values iv2
where
iv1.recipe_id = iv2.recipe_id
AND iv1.ingred_id in (3,17)
AND iv1.ingred_id != iv2.ingred_id
AND iv2.ingred_id in (3,17);
您的查询正在使用IN子句,该子句返回任何具有inred_value为3 OR 17的行。但您需要的是具有BOTH 3 AND 17记录的配方。
答案 1 :(得分:0)
如果您只想要食谱,我建议使用聚合和having
:
select recipe
from ingreds_values
where ingred_id in (3, 17)
group by recipe
having count(distinct ingred_id) = 2;
如果您想要实际的行,您有几个选项。怎么样?
select iv.*
from ingreds_values iv
where exists (select 1 from ingreds_values iv2 where iv2.recipe = iv.recipe and iv2.ingred_id = 3) and
exists (select 1 from ingreds_values iv2 where iv2.recipe = iv.recipe and iv2.ingred_id = 17) and
iv.ingred_id in (3, 17);