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

Verificando se uma receita contém um ingrediente - MYSQL


Sugiro armazenar a contagem do número de ingredientes da receita na tabela de receitas, apenas por questão de eficiência (isso tornará a consulta mais rápida se não precisar calcular essa informação todas as vezes). Isso é desnormalização, o que é ruim para a integridade dos dados, mas bom para o desempenho. Você deve estar ciente de que isso pode causar inconsistências de dados se as receitas forem atualizadas e você não tiver o cuidado de garantir que o número seja atualizado em todos os locais relevantes. Eu assumi que você fez isso com a nova coluna definida como ing_count na tabela de receitas.

Certifique-se de escapar os valores para NAME1, NAME2, etc, se eles forem fornecidos por meio de entrada do usuário - caso contrário, você corre o risco de injeção de SQL.
select recipe.rid, recipe.recipe_name, recipe.ing_count, count(ri) as ing_match_count
from recipe_ingredients ri 
inner join (select iid from ingredients where i.name='NAME1' or i.name='NAME2' or i.NAME='NAME3') ing
on ri.iid = ing.iid
inner join recipe 
on recipe.rid = ri.rid
group by recipe.rid, recipe.recipe_name, recipe.ing_count
having ing_match_count = recipe.ing_count

Se você não quiser armazenar a contagem de receitas, você pode fazer algo assim:
select recipe.rid, recipe.recipe_name, count(*) as ing_count, count(ing.iid) as ing_match_count
from recipe_ingredients ri 
inner join (select iid from ingredients where i.name='NAME1' or i.name='NAME2' or i.NAME='NAME3') ing
on ri.iid = ing.iid
right outer join recipe 
on recipe.rid = ri.rid
group by recipe.rid, recipe.recipe_name
having ing_match_count = ing_count