2017-11-23 4 views
0

Ich versuche, ein Kochbuch zu machen, und ich habe ein Problem mit der Duplizierung. Es wird leichter sein, mit einem Beispiel zu verstehen, so lassen Sie uns beginnen:MySQL-Gruppe doppelte ID ohne andere Daten zu verlieren

Meine Tabellen wie folgt aussehen:

create table Recipe (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(25), 
    description VARCHAR(50), 
    instructions VARCHAR(500)) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8; 

create table Ingredient (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(50)) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8; 

create table Measure (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(30)) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8; 

create table RecipeIngredient (
    recipe_id INT NOT NULL, 
    ingredient_id INT NOT NULL, 
    measure_id INT, 
    amount INT, 
    CONSTRAINT fk_recipe FOREIGN KEY(recipe_id) REFERENCES Recipe(id), 
    CONSTRAINT fk_ingredient FOREIGN KEY(ingredient_id) REFERENCES Ingredient(id), 
    CONSTRAINT fk_measure FOREIGN KEY(measure_id) REFERENCES Measure(id)) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8; 

und wenn ich eine Abfrage, die wie folgt aussieht:

SELECT r.name AS 'Recipe', 
    r.instructions, 
    ri.amount AS 'Amount', 
    mu.name AS 'Unit of Measure', 
    i.name AS 'Ingredient' 
FROM Recipe r 
JOIN RecipeIngredient ri on r.id = ri.recipe_id 
JOIN Ingredient i on i.id = ri.ingredient_id 
LEFT OUTER JOIN Measure mu on mu.id = measure_id; 

I ‚m immer dieses Ergebnis:

enter image description here

Das Problem ist, dass C Hocolate Cake kopiert, obwohl es das gleiche Rezept ist, es hat nur mehr als eine Zutat. Könnten Sie mir bitte helfen, dieses Problem zu lösen, damit ich eine Rezeptur bekomme?

+0

Sie haben nicht genügend Informationen zur Verfügung gestellt. Angenommen, wir erhalten nur eine Zeile pro Rezept, wie Sie es wünschen, wie soll es angezeigt werden? Was passiert mit den Säulen der Maßeinheiten, Zutaten und Mengen? –

+0

Sorry wegen Verwirrung. Was ich gerne haben möchte, ist eine Instanz eines Rezepts mit allen Zutaten. Ist das überhaupt möglich? – Deividas

+0

Ja, Sie wollen die GROUP BY-Klausel und die CONCAT-Funktion betrachten. –

Antwort

0

Verwenden Sie GROUP_CONCAT, um Werte aus mehreren Zeilen in einer Gruppe in eine durch Kommas getrennte Liste zu kombinieren. Und verwenden Sie CONCAT zum Verketten von Strings, wie das Verketten der Menge an die Einheit und die Zutat.

SELECT r.name, r.instructions, 
    GROUP_CONCAT(CONCAT(ri.amount, mu.name, ' ', i.name)) AS ingredients 
FROM Recipe r 
JOIN RecipeIngredient ri on r.id = ri.recipe_id 
JOIN Ingredient i on i.id = ri.ingredient_id 
LEFT OUTER JOIN Measure mu on mu.id = measure_id 
GROUP BY r.id; 
+0

Vielen Dank für euch beide! Liebe diese Gemeinschaft. – Deividas

Verwandte Themen