Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL-Query necessário para encontrar IDs distintos provavelmente usando IN e NOT IN

Select Distinct ...
From Recipes As R
Where R.ingredient in(ingredient_a, ingredient_b...)
    And Not Exists(
                    Select 1
                    From Recipes As R2
                    Where R2.Recipe = R.Recipe
                        And R2.Ingredient In(ingredient_d)
                    )

Como Jeffrey L Whitledge mencionou, a consulta acima retornará qualquer receita que tenha pelo menos uma ingrediente na lista desejada e nenhum na lista indesejada. No entanto, se você quiser retornar receitas que contenham todos os ingredientes na lista desejada e nenhum na lista indesejada você pode fazer:
Select Distinct ...
From Recipes As R
Where Exists    (
                Select 1
                From Recipes As R2
                Where R2.Recipe = R.Recipe
                    And R2.ingredient in(ingredient_a, ingredient_b...)
                Having Count(*) = @CountOfPassedIngredients
                )
    And Not Exists(
                    Select 1
                    From Recipes As R2
                    Where R2.Recipe = R.Recipe
                        And R2.Ingredient In(ingredient_d)
                    )

Nesse cenário, você precisaria primeiro determinar a contagem dos ingredientes desejados.