0

我有 3 个数据库表。第一个包含配料,第二个包含菜肴,第三个包含配料和菜肴。

描述

向这些表中添加数据很容易,但我在尝试选择特定内容时遇到了问题。

为特定菜肴重新使用所有食材。

SELECT * 
FROM Ingredient As I 
JOIN DishIngredients as DI 
     ON I.ID = DI.IngredientID 
WHERE DI.DishID = 1; 

但是,如果我尝试查询菜肴名称和描述,无论我使用哪种加入方式,我总是得到的结果数量等于使用的成分数量。如果我的菜中有 4 种成分然后选择返回名称和描述 4 次,我如何修改我的 slect 以仅选择一次这些值?

如果我尝试选择名称和描述,这是我的查询结果(与鹰的相同)。我正在使用 MS SQL。

ID          Name        Description                                                          DishID IngredientID
-- -------------------- -------------------------------------------------------------------- ------ ---------
1  Spaghetti Carbonara  This delcitious pasta is made with fresh Panceta and Single Cream    1      1
1  Spaghetti Carbonara  This delcitious pasta is made with fresh Panceta and Single Cream    1      2

Kuzgun 的查询对我来说效果很好。但是,从您的建议中,我发现我真的不需要加入 DishIngredient 和 Dish。当我需要名称和描述时,我可以简单地选择

  SELECT * FROM Dish WHERE ID=1;

Wehn 我需要成分列表,我可以使用上面的查询。

4

2 回答 2

1

如果您需要同时显示菜肴详情和配料详情,则需要连接所有 3 个表:

SELECT * 
FROM Ingredient As I 
JOIN DishIngredients as DI 
     ON I.ID = DI.IngredientID 
JOIN Dish AS D
     ON D.ID=DI.DishID
WHERE DI.DishID = 1; 
于 2013-11-14T11:50:34.293 回答
0

如果您不关心成分,则不必使用表 DishIngredient。只需使用 tale Dish。select * from dish d where d.id=1. 如果你想知道成分是什么,你使用的sql只是查询表成分的id。没用。因为你的数据库的设计,一点冗余是必须的。

select * from dish d join dishingredient di on d.id=di.dishid join ingredient i on    
i.id=di.ingredientid where d.id=1

当然,您将获得包含菜肴名称和描述的结果数量。如果您想获得完整的信息但最少的冗余,您可以分两步完成:

select * from dish d where d.id=1;
select * from ingredient i join DishIngredient di on i.id=di.ingredientid where       di.dishid=1

在 java 中,您可以编写一个类来表示一道菜和一个列表来表示它使用的成分。

public class Dish {
    BigDecimal id;
    String name;
    String description;
    List<Ingredient> ingredient;
}
class Ingredient{
    BigDecimal id;
    String name;
    .....
}
于 2013-11-14T12:19:45.787 回答