2017-11-23 2 views
0

私は料理本を作ろうとしていますが、重複に問題があります。一例で理解することが容易になり、それでは始めましょうます:MySQLグループは、他のデータを失うことなくIDを複写します。

私のテーブルは次のようになります。

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:

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; 

をし、私はこのようなクエリを実行すると「は、この結果になっM:

enter image description here

問題があるということをCたとえそれがちょうど1つ以上の成分を持っているのと同じレシピであっても、ホコリケーキは複製しています。あなたは私がこの問題を解決するのを助けてください、私はレシピの1つのインスタンスを得るでしょうか?

+0

あなたは十分な情報を提供していません。レシピごとに1行しか必要としないとしたら、どのように表示するのですか?のように、測定単位、成分、および量の列はどうなりますか? –

+0

混乱して申し訳ありません。私が得たいのは、すべての成分を含むレシピの1つのインスタンスです。それも可能ですか? – Deividas

+0

ええ、あなたはGROUP BY句とCONCAT関数を見たいと思います。 –

答えて

0

GROUP_CONCATを使用すると、グループ内の複数の行の値をカンマで区切ったリストにまとめることができます。そして、単位と成分に量を連結するように、文字列を連結するのにCONCATを使用してください。

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

お二人とも大変ありがとう!このコミュニティを愛してください。 – Deividas

関連する問題