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

Tjek at en opskrift indeholder en ingrediens - MYSQL

Jeg vil foreslå at gemme optællingen af ​​antallet af ingredienser til opskriften i opskriftstabellen, bare for effektivitetens skyld (det vil gøre forespørgslen hurtigere, hvis den ikke skal beregne disse oplysninger hver gang). Dette er denormalisering, hvilket er dårligt for dataintegriteten, men godt for ydeevnen. Du skal være opmærksom på, at dette kan forårsage datainkonsistens, hvis opskrifter opdateres, og du ikke er omhyggelig med at sikre, at nummeret er opdateret alle relevante steder. Jeg har antaget, at du har gjort dette med den nye kolonne angivet som ing_count i opskriftstabellen.

Sørg for at undslippe værdierne for NAVN1, NAVN2 osv., hvis de er angivet via brugerinput - ellers er du i fare for 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

Hvis du ikke vil gemme antallet af opskrifter, kan du gøre noget som dette:

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. MySQL - Vælg den seneste dato ud af et sæt af flere mulige tidsstempler?

  2. How to_timestamp() virker i PostgreSQL

  3. fremad cross edition triggere i R12.2

  4. For Nvarchar(Max) får jeg kun 4000 tegn i TSQL?