我有2张桌子 - 菜肴和成分:
我希望能够列出每道菜的所有成分的名称以及每道菜的名称。
我写过这个查询并没有用名称替换成分ID,而是选择返回一个空集 - 请解释一下我做错了什么:
SELECT dishes.name, ingredients.name, ingredients.id
FROM dishes
INNER JOIN ingredients
ON dishes.ingredient_1=ingredients.id,dishes.ingredient_2=ingredients.id,dishes.ingredient_3=ingredients.id,dishes.ingredient_4=ingredients.id,dishes.ingredient_5=ingredients.id,dishes.ingredient_6=ingredients.id, dishes.ingredient_7=ingredients.id,dishes.ingredient_8=ingredients.id;
如果您可以参考:
,那就太棒了无视希伯来文 - 将其视为自己的语言。
答案 0 :(得分:2)
在我看来,一个更好的数据库结构将有一个 Dishes_Ingredients_Rel 表,而不是有一堆成分列。
class EntityDetail {
String id;
String name;
String type;
}
然后,你可以做一个更简单的JOIN。
DISHES_INGREDIENTS_REL
DishesID
IngredientID
答案 1 :(得分:1)
<强> 1。数据库结构的逻辑 - 我正确地做到了吗?
Pizza
PizzaIngredients
Ingredients
Pizza
会有ID
,name
和type
,其中ID
是主键。
PizzaIngredients
会有PizzaId
和IngredientId
(这是一个多表,其中主键是PizzaId
和IngredientID
的复合键
Ingredients
有ID
和name
,其中ID
是主键。
<强> 2。列出每道菜的所有成分的名称以及每道菜的名称。 MySQL
(未经测试)中的此类内容:
SELECT p.ID, p.name, GROUP_CONCAT(i.name) AS ingredients
FROM pizza p
INNER JOIN pizzaingredients pi ON p.ID = pi.PizzaID
INNER JOIN ingredients i ON pi.IngredientID = i.ID
GROUP BY p.id
第3。如果您之前遇到过这样的问题 - 需要单对多关系的问题 - 您是如何使用PHP&amp; MySQL的吗
答案 2 :(得分:1)
您获得空结果的原因是因为您正在设置永远不会满足的连接条件。在INNER连接执行期间,数据库引擎将第一个表的每个记录与试图找到匹配的第二个记录进行比较,其中被评估的成分表记录的id等于成分1和成分2,依此类推。如果您在第一个表中创建一个记录,并且在所有8列中都使用相同的成分,则会返回一些结果(仅用于测试目的)。
关于数据库结构,您选择一个非规范化的结构,为每个成分创建8列。在这个数据结构上有很多可能的考虑因素(性能,可维护性,或者只是考虑一下你是否被要求插入含有9种成分的菜肴),我个人会寻求标准化的数据结构。
但是如果你想保留这个,你应该写一些类似的东西:
SELECT dishes.name, ingredients1.name, ingredients1.id, ingredients2.name, ingredients2.id, ...
FROM dishes
LEFT JOIN ingredients AS ingredients1 ON dishes.ingredient_1=ingredients1.id
LEFT JOIN ingredients AS ingredients2 ON dishes.ingredient_2=ingredients2.id
LEFT JOIN ingredients AS ingredients3 ON dishes.ingredient_3=ingredients3.id
...
LEFT join是获得不匹配成分的结果所必需的(如果未设置任何成分,则为0值)