2017-11-23 5 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; 

및 I는 다음과 같다 쿼리를 실행할 때 이 결과는 '점점 M :

enter image description here

문제가 있다는 것이다를 C hocolate Cake는 하나 이상의 성분을 가진 동일한 제조법 임에도 불구하고 복제합니다. 이 문제를 해결할 수 있도록 도와 주시겠습니까? 그렇다면 레서피의 인스턴스를 하나 얻으시겠습니까?

+0

충분한 정보를 제공하지 않았습니다. 원하는대로 레시피 당 한 줄만 얻는다 고 가정하면 어떻게 표시 할 것입니까? 에서와 같이 측정 단위, 성분 및 수량 열은 어떻게됩니까? –

+0

혼란을 드려 죄송합니다. 내가 얻고 자하는 것은 모든 재료를 가진 조리법의 한 예입니다. 그게 가능한가? – 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