我有3个数据库表。 第一个含有成分,第二个含有菜肴,第三个含有成分和菜肴。
向这些表添加数据很简单,但在尝试选择特定内容时遇到了问题。
为特定菜肴重新加入所有成分。
SELECT *
FROM Ingredient As I
JOIN DishIngredients as DI
ON I.ID = DI.IngredientID
WHERE DI.DishID = 1;
但是,如果我尝试查询菜名称和描述,无论我使用什么样的加入我总是得到的结果数量等于使用的成分数量。如果我的菜中有4种成分,那么选择返回名称和描述4次,如何修改我的选择以仅选择这些值?
如果我尝试选择名称和描述,这是我的查询结果(与hawk相同)。我正在使用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的查询对我来说很好。然而,从你的sugestions我看到我真的不需要加入DishIngredient和Dish之间。 当我需要Name和Descritpion时,我可以简单地选择
SELECT * FROM Dish WHERE ID=1;
我需要我可以使用上述查询的成分列表。
答案 0 :(得分: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;
答案 1 :(得分:0)
如果您不关心成分,则不必使用DishIngredient表。只需使用故事菜。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;
.....
}