Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  5 2423
Hei,

Jeg holder på å lage et lite oppskriftssystem med MySQL og PHP, jeg har strukturert tabellene sånn:
Oppskrift:
RecipeID (PK)
andre felt...

Ingredienser:
IngredientID (PK)
...

Oppskrift-ingrediens:
ID (PK)
RecipeID (FK)
IngredientID (FK)

Hvordan kan jeg hente alle oppskrifter som kan lages av ingrediens A, B og C?
Altså:
Oppskrift 1 - A, B = Hentes
Oppskrift 2 - A, C, D = Hentes ikke siden D ikke er med.
Oppskrift 3 - C = Hentes

Jeg har prøvd meg med dette:

Kode

SELECT DISTINCT r.* FROM recipe AS r INNER JOIN ingredients  AS i ON r.RecipeID = i.RecipeID AND i.IngredientID IN(A, B, C);
Men denne bryr seg ikke om en oppskrift mangler noe.

Kan det i det hele tatt gjøres med en spørring? Eller må jeg bare behandle dataene med PHP?
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Det kan nesten garantert gjøres med en spørring, men first things first - jeg tror du har en feil i skjemaet ditt. Burde ikke ingredienser og oppskrifter være uavhengige av hverandre, men i et mange-til-mange-forhold?

Altså ikke Recipe en-til-mange Ingredient, men [Recipe]-(mange-til-en)-[RecipeIngredient]-(en-til-mange)-[Ingredient]?

Jeg løste et liknende problem for noen dager siden, i mitt tilfelle var det snakk om å oversette et uttrykk på en viss syntaks til en SQL-spørring for å finne "objekter" (med M2M-forhold mot "tags"), og det jeg endte opp med blir noe som dette - som helt sikkert kan brukes i ditt tilfelle, som blir en litt enklere problemstilling.

Hvis vi går ut fra at du bruker samme struktur jeg foreslo og, for eksempel ,sier "inneholder makaroni og pølser":

Kode

SELECT * FROM Recipe INNER JOIN (
	SELECT DISTINCT RecipeID FROM RecipeIngredients WHERE (
		RecipeID IN (SELECT RecipeID FROM RecipeIngredients WHERE IngredientID = 'pølse')  
		AND 
		RecipeID IN (SELECT RecipeID FROM RecipeIngredients WHERE IngredientID = 'makaroni')
	) 
) Results ON Recipe.ID = Results.RecipeID
Dette er løst oversatt og formatert av en spørring programmet mitt har generert, så jeg vet ikke helt hvor fancy det er, eller om det finnes optimiseringer som kan gjøres maskinelt... tar gjerne imot innspill selv.
Sist endret av robhol; 20. oktober 2014 kl. 23:48.
Jeg er ikke helt ekspert på dette med en til mange og mange til en, men jeg ser jeg har en feil i sql-spørringa mi.

Jeg joiner såklart på recipe-ingredient tabellen og ikke ingredient-tabellen (Kanskje det du tenker på?).

Skal teste spørringa di
Sist endret av Yochi; 21. oktober 2014 kl. 05:43. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Det er ikke jeg heller, av den enkle grunnen at det er forvirrende og utrolig lett å blande sammen "endene" av relasjoner mellom tabeller. For eksempel mente jeg selvfølgelig at én Recipe og én Ingredient begge har mange RecipeIngredients.

Til mitt forsvar var det sent på kvelden.
Jeg tror dette blir vanskelig å løse på en tilfredsstillende måte vha. spørringer, siden ikke alle ingredienser passer særlig godt sammen. Om jeg oppgir at jeg har "Kjøtt", "Melk", "Sennep" og "Hasj" så ønsker du ikke å finne en oppskrift som inneholder *alle* disse tingene, men en som inneholder enkelte hovedbestanddeler (prismessig eller smaksmessig) som f.eks. kjøtt og melk. Den beste oppskriften er derfor den som avviker minst fra det som er oppgitt, og derfor tenker jeg at det er bedre å løse dette med flere små spørringer og så behandle de med logikk. Da kan du legge til flere forslag som ligger i nærheten, men som mangler noen ingredienser. Kanskje det da går opp for brukeren at han/hun faktisk har ingrediensen liggende, eller ser at det er billig og enkelt å kjøpe på butikken på hjørnet.

Du bør også lagre unna enkelte ingredienser som mindre tellende, f.eks. krydder, vann, og ingredienser som valgfrie i en gitt oppskrift (f.eks. honning, buljong, fløte).

Jeg ville løst dette ved å identifisere de N mest viktigte råvarene i lista og laget en spørring basert på disse. Deretter ville jeg har kjørt spørringer for å finne de mest populære oppskriftene som har minst N-1 ingredienser på lista, og brukt disse som tips på siden - eller som alternativ hvis den første spørringen ikke ga noe resultat. Disse spørringene må så filtreres basert på de mindre viktige ingrediensene, slik at flest mulig av de blir med. Her kunne det vært nyttig å ha en liste over ting man *ikke* vil ha med, f.eks. en "liker ikke"- eller allergi-liste.
Vet ikke om det er til noe hjelp, men denne siden kan være til inspirasjon om ikke annet.