Mysql
 sql >> Database >  >> RDS >> Mysql

Verifica che una ricetta contenga un ingrediente - MYSQL

Suggerirei di memorizzare il conteggio del numero di ingredienti per la ricetta nella tabella delle ricette, solo per motivi di efficienza (renderà la query più veloce se non deve calcolare queste informazioni ogni volta). Questa è la denormalizzazione, che è dannosa per l'integrità dei dati ma buona per le prestazioni. Dovresti essere consapevole del fatto che ciò può causare incongruenze nei dati se le ricette vengono aggiornate e non stai attento ad assicurarti che il numero sia aggiornato in ogni luogo pertinente. Ho pensato che tu l'abbia fatto con la nuova colonna impostata come ing_count nella tabella delle ricette.

Assicurati di evitare i valori per NAME1, NAME2, ecc. se vengono forniti tramite l'input dell'utente, altrimenti sei a rischio di SQL injection.

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 non vuoi memorizzare il conteggio delle ricette, puoi fare qualcosa del genere:

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