2013-11-28 3 views
0

음식은 단순하거나 불규칙 할 수 있습니다 .. 만약 그 단순한 유형이 .. 복잡하다면 간단한 음식으로 구성됩니다 나는 모든 레스토랑을 선택하기 위해 쿼리를 생성해야합니다. 음식 유형 = 고기를 가진 모든 가짜 요리를 판매했습니다. 나는 많은 일을 시도하지만 문제가 발생하지는 않습니다.부분을 사용하여 mysql에있는 모든 요소를 ​​선택하십시오

create table Restaurant(
     nameR VARCHAR(80), 
     primary key (nameR)); 

    create table Sold(
     nameF VARCHAR(80), 
     nameR VARCHAR(80), 
     date VARCHAR(20); 
     constraint c3 primary key(nameF,nameR,date), 
     foreign key(nameF) references Dish(nameF), 
     foreign key(nameR) references Restaurante(nameR), 
     foreign key(date) references Data(date)); 

    create table Dishe(
     nameF VARCHAR(80), 
     primary key (nameF), 
     foreign key (nameF) references Food(nameF)); 

    create table Simple( 
     nameF VARCHAR(80), 
     type VARCHAR(80), 
     primary key (nameF), 
     foreign key (nameF) references Food(nameF)); 

    create table Agregate(
     nameF VARCHAR(80), 
     calorias double, 
     primary key (nameF), 
     foreign key (nameF) references Food(nameF)); 

    create table Composition(
     nameAgg VARCHAR(80), 
     nameS VARCHAR(80), 
     quantidade integer, 
     constraint c1 primary key(nameAgg,nameS), 
     foreign key(nameAgg) references Agregate(nameF), 
     foreign key(nameS) references Simple(nameF)); 

    create table Food( 
     nameF varchar(80) 
     primary key (nameF)); 

나는 부서를 올바르게 사용해야한다고 생각합니까? 당신은 또한 "판매"의 외래 키에 데이터 테이블을 참조,

감사

답변

1

귀하의 SQL은 몇 가지 구문 오류가 생각 나는 "Dishe"테이블이 존재하는 이유는 확실하지 않다 무엇을 말해 - Food와 같은 데이터를 저장하는 것 같습니다.

어쨌든, 여기에 테이블을 생성하는 SQL을 수정 것 :

create table Restaurant(
    nameR VARCHAR(80), 
    primary key (nameR) 
); 

create table Food( 
    nameF varchar(80), 
    type varchar(80), 
    primary key (nameF) 
); 

create table Dishe(
    nameF VARCHAR(80), 
    primary key (nameF), 
    foreign key (nameF) references Food(nameF) 
); 

create table Sold(
    nameF VARCHAR(80), 
    nameR VARCHAR(80), 
    date VARCHAR(20), 
    constraint c3 primary key(nameF,nameR,date), 
    foreign key(nameF) references Dishe(nameF), 
    foreign key(nameR) references Restaurant(nameR) 
); 

우리는 몇 가지 테스트 데이터를 삽입 할 수 있습니다

INSERT INTO Restaurant (nameR) VALUES ('McDonalds'); 
INSERT INTO Restaurant (nameR) VALUES ('Vital Ingredient'); 
INSERT INTO Restaurant (nameR) VALUES ('David Food'); 
INSERT INTO Food (nameF, type) VALUES ('Burger', 'meat'); 
INSERT INTO Food (nameF, type) VALUES ('Salad', 'veg'); 
INSERT INTO Dishe (nameF) VALUES ('Burger'); 
INSERT INTO Dishe (nameF) VALUES ('Salad'); 
INSERT INTO Sold VALUES ('Salad', 'David Food', '2013-12-05'); 
INSERT INTO Sold VALUES ('Burger', 'McDonalds', '2013-12-04'); 
INSERT INTO Sold VALUES ('Burger', 'McDonalds', '2013-12-05'); 
INSERT INTO Sold VALUES ('Burger', 'Vital Ingredient', '2013-12-05'); 
INSERT INTO Sold VALUES ('Salad', 'Vital Ingredient', '2013-12-04'); 

이 3 개 개의 레스토랑을 생성, 단 하나의 레스토랑에서는 고기 요리를 판매했다.

내가 생각할 수있는 두 가지 방법은 모든 고기 요리를 판매 한 식당을 반환하는 것입니다. 첫 번째 부문을 사용하지 않습니다 - 그것은이 "고기"를 동일한 경우 함께 각 레스토랑에서 제공하는 요리의 모든 종류의 스틱과 볼 수 GROUP_CONCAT 함수를 사용

SELECT 
    Sold.nameR 
FROM 
    Sold 
INNER JOIN 
    Food 
ON 
    Food.nameF = Sold.nameF 
GROUP BY 
    Sold.nameR 
HAVING 
    GROUP_CONCAT(DISTINCT Food.type) = 'meat' 
; 

두 번째는 계산하기 위해 분할을 사용 각 식당에서 판매하는 육류 요리의 수를 나누어 총 요리 수로 나누고 이것이 1인지 확인하십시오. 즉, 제공되는 요리의 100 %가 고기입니다. 이 방법은 하위 쿼리 때문에 위의 것보다 느릴 수 있습니다.

SELECT 
    Restaurant.nameR 
FROM 
    Restaurant 
WHERE 
    (
    SELECT 
     COUNT(*) 
    FROM 
     Sold 
    INNER JOIN 
     Food 
    ON 
     Food.nameF = Sold.nameF 
    WHERE 
     Food.type = 'meat' 
    AND 
     Sold.nameR = Restaurant.nameR 
    )/(
    SELECT 
     COUNT(*) 
    FROM 
     Sold 
    INNER JOIN 
     Food 
    ON 
     Food.nameF = Sold.nameF 
    WHERE 
     Sold.nameR = Restaurant.nameR 
    ) = 1 
; 
+0

검색어 선택 1+ 요리 유형 = 고기를 판매하는 레스토랑 .. 고기 종류의 모든 요리를하는 식당을 선택하고 싶습니다. – user3046650

+0

아, 죄송합니다. 귀하의 요구 사항을 오해했습니다. 답변을 변경하겠습니다. – madebydavid

+0

@ user3046650 - 내 대답이 업데이트되었습니다. 예상 한 결과인지 알려주세요. 감사. – madebydavid

관련 문제