2013-11-28 11 views
0

食物可以是简单或Agregate ..如果它的简单它有一个类型..如果它有一个简单的食物组成 我需要创建一个查询来选择所有餐馆出售食物类型=肉类的所有聚集菜肴。我尝试了很多东西,但是我无法解决问题。使用部门来选择所有元素在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'); 

这将创建三个餐厅,只有一间餐厅已经售出只有肉类菜肴。

有两种方法我可以想到哪些会返回卖过所有肉类菜肴的餐馆。第一个不使用分裂 - 它使用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+菜式=肉..我想选择SOL所有菜肴型肉餐厅.. – user3046650

+0

啊,对不起,我误解了你的要求 - 我会改变答案。 – madebydavid

+0

@ user3046650 - 我更新了我的答案,请让我知道这是否是您期待的结果。谢谢。 – madebydavid