sql >> Database >  >> RDS >> Mysql

Controleren of een recept een ingrediënt bevat - MYSQL

Ik stel voor om de telling van het aantal ingrediënten voor het recept in de receptentabel op te slaan, alleen voor de efficiëntie (het zal de zoekopdracht sneller maken als het deze informatie niet elke keer hoeft te berekenen). Dit is denormalisatie, wat slecht is voor de gegevensintegriteit, maar goed voor de prestaties. U dient zich ervan bewust te zijn dat dit inconsistenties in de gegevens kan veroorzaken als recepten worden bijgewerkt en u niet zorgvuldig bent om ervoor te zorgen dat het nummer op elke relevante plaats wordt bijgewerkt. Ik neem aan dat je dit hebt gedaan met de nieuwe kolom ingesteld als ing_count in de receptentabel.

Zorg ervoor dat u de waarden voor NAME1, NAME2 enz. escapet als ze zijn verstrekt via gebruikersinvoer - anders loopt u het risico op SQL-injectie.

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

Als u het aantal recepten niet wilt opslaan, kunt u zoiets als dit doen:

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. Hoe GREATEST() werkt in MariaDB

  2. Een overzicht van replicatie op volumeniveau voor PostgreSQL met DRBD

  3. jquery php gegevens in mysql invoegen zonder de pagina te vernieuwen

  4. UTF8 en Japanse karakters