2016-03-31 17 views
0

Ich habe eine einfache Rezept-Datenbank, die ich versuche, eine Abfrage zu schreiben, die ein Rezept sowie alle ziehen wird zugehörige Zutaten und Schritte. Das Rezept selbst hat eine Viele-zu-viele-Beziehung mit Inhaltsstoffen (um die Wiederverwendung von Inhaltsstoffeinträgen zu fördern) und eine Eins-zu-Viele-Beziehung mit Schritten (Chancen sind ein Rezept hat keinen identischen Schritt zum anderen, also keine Notwendigkeit zur Wiederverwendung hier).SQLite - Wählen Sie mit JOINs zu Viele-zu-Viele und Eins-zu-Viele

Die Datenbank ist Setup wie so:

CREATE TABLE Recipe (
    _id INTEGER PRIMARY KEY, 
    recipe_name TEXT UNIQUE NOT NULL 
); 

CREATE TABLE Ingredient (
    _id INTEGER PRIMARY KEY, 
    ingredient TEXT UNIQUE NOT NULL 
); 

CREATE TABLE RecipeIngredient (
    _id INTEGER PRIMARY KEY, 
    recipe_id INTEGER, 
    ingredient_id INTEGER, 
    amount REAL, 
    FOREIGN KEY (recipe_id) REFERENCES Recipe(_id), 
    FOREIGN KEY (ingredient_id) REFERENCES Ingredient(_id) 
); 

CREATE TABLE Step (
    _id INTEGER PRIMARY KEY, 
    instruction TEXT NOT NULL, 
    number INTEGER NOT NULL, 
    recipe_id INTEGER, 
    FOREIGN KEY (recipe_id) REFERENCES Recipe(_id) 
); 

Ich bin in der Lage durch _id alle Daten für ein bestimmtes Rezept ziehen mit inneren Joins auf allen Tischen (die eine Tonne von doppelten Daten erstellt), aber wo ich feststecke, ist, wie kann ich diese gruppieren/bestellen, um die Daten nützlich zu machen, ohne dass ein zusätzliches Parsen der Ergebnisse notwendig ist, um ein bedeutungsvolles Objekt zu erhalten? Wäre es in zwei Fragen besser (eine für die Zutaten und eine für die Schritte)?

UPDATE

einige Beispieldaten hinzufügen, die von der Auswahl einer Rezept-ID kommt zurück, zwischen den Tischen zu tun INNER JOIN (geordnet nach Ingredienz/Schrittzahl):

|| recipe || || ingredient|| ||step|| ||step number|| 
"Recipe One" "Ingredient 1" "Step 1"   "1" 
"Recipe One" "Ingredient 1" "Step 2"   "2" 
"Recipe One" "Ingredient 1" "Step 3"   "3" 
"Recipe One" "Ingredient 2" "Step 1"   "1" 
"Recipe One" "Ingredient 2" "Step 2"   "2" 
"Recipe One" "Ingredient 2" "Step 3"   "3" 
"Recipe One" "Ingredient 3" "Step 1"   "1" 
"Recipe One" "Ingredient 3" "Step 2"   "2" 
"Recipe One" "Ingredient 3" "Step 3"   "3" 
+0

Zeigen Sie uns einige Daten und was Sie wollen. Zeigen Sie uns auch Ihre 'INNER JOIN' mit' duplicated data' und das können wir auch beheben. Sie können ein funktionierendes Beispiel auf sqlFiddle.com erstellen. Verwenden Sie 'Text to DDL', um Ihr Datenbankschema zu laden. –

+0

@JuanCarlosOropeza fügte weitere Informationen hinzu, aber nach Thorstens Antwort denke ich, dass es besser ist, das in zwei Abfragen zu trennen. –

Antwort

2

Wenn Sie dies denken Durch, Sie werden sich selbst merken, dass es keinen Sinn macht, all dies in einer Abfrage zu setzen. Welches Ergebnis würdest du erwarten? Schritt 1: Heizen Sie den Ofen und die Zutaten sind Zucker, Mehl und Milch. Schritt 2: Mischen Sie Zucker und Mehl und die Zutaten sind Zucker, Mehl und Milch. Schritt 3: Milch hinzufügen und die Zutaten sind Zucker, Mehl und Milch ...

Was Sie eigentlich wollen, ist eine Liste der Zutaten (Abfrage 1) und die Schritte zu nehmen (Abfrage 2).

Ich nehme an, dass diese Abfragen kein Problem für Sie sind, waren Sie nur verwirrt, ob und wie Sie sie kombinieren. Die Antwort ist einfach: Nicht.

Wenn Sie weitere Hilfe benötigen, sagen Sie es mir.

+0

Sie haben Recht, 'Steps' hat keine Beziehung zu Zutaten. Ein anderer Fall wäre, wenn Sie etwas wie "Zutaten A und B auf Schritt 1" brauchen, aber Sie haben das nicht. –

+0

Dies ist, was ich dachte, aber ich habe nicht mit irgendwelchen SQL in ein paar Jahren gearbeitet und bin definitiv eingerostet, also dachte ich, dass Fragen würde nicht weh tun. Danke für die schnelle Antwort! –

Verwandte Themen