查找必须包含两个值的行,而不仅仅是其中一个

时间:2015-12-30 16:04:11

标签: mysql

我需要查找具有两个值的行,例如:

找到所有食谱中必须含有面粉和糖的食谱,但是根据我的查询,我得到所有含糖或面粉的食谱。

这是我的查询:

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

2 个答案:

答案 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);