sql >> Databasteknik >  >> RDS >> Mysql

Kontrollera att ett recept innehåller en ingrediens - MYSQL

Jag skulle föreslå att du lagrar antalet ingredienser för receptet i recepttabellen, bara för effektivitetens skull (det kommer att göra frågan snabbare om den inte behöver beräkna denna information varje gång). Detta är denormalisering, vilket är dåligt för dataintegriteten men bra för prestanda. Du bör vara medveten om att detta kan orsaka datainkonsekvenser om recept uppdateras och du är inte noga med att se till att numret uppdateras på alla relevanta ställen. Jag har antagit att du har gjort detta med den nya kolumnen som ing_count i recepttabellen.

Se till att du undviker värdena för NAMN1, NAMN2 osv om de tillhandahålls via användarinmatning - annars riskerar du att få SQL-injektion.

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

Om du inte vill lagra receptantalet kan du göra något så här:

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


  1. En översikt över betrodda tillägg i PostgreSQL 13

  2. Mappa anpassad JdbcTemplate-förfrågan i ett objekt

  3. Flera värdnamn och flera privilegier?

  4. Hur man startar upp MySQL eller MariaDB Galera Cluster - Uppdaterad