【发布时间】:2016-05-02 18:18:08
【问题描述】:
我正在尝试为一家减肥诊所的客户创建一个膳食计划数据库。这些是一些食谱:
+-----------+-----------------------+
| recipe_ID | recipe_name |
+-----------+-----------------------+
| 1 | Healthy Burritos |
| 2 | Stuffed Peppers |
| 3 | Breakfast Pizza Slice |
+-----------+-----------------------+
这是一天的计划:
+--------+-----------+-------+--------+
| ddp_ID | breakfast | lunch | dinner |
+--------+-----------+-------+--------+
| 1 | 3 | 1 | 2 |
+--------+-----------+-------+--------+
计划中早餐、午餐和晚餐中的每个数字都是一个外键,指的是食谱的 ID。我想执行一个查询,该查询将获取要为用户显示的每个配方的名称。这就是我所拥有的,但我遇到了以下我似乎无法解决的错误:错误 1066 (42000): Not unique table/alias: 'daily_diet_plan'
SELECT
recipe.recipe_name
FROM
recipe
INNER JOIN daily_diet_plan ON (daily_diet_plan.breakfast = recipe.recipe_ID)
INNER JOIN daily_diet_plan ON (daily_diet_plan.lunch = recipe.recipe_ID)
INNER JOIN daily_diet_plan ON (daily_diet_plan.dinner = recipe.recipe_ID);
非常感谢您提供的任何帮助!对此,我真的非常感激。
编辑:这行得通!
SELECT recipe.recipe_name
FROM recipe
LEFT JOIN daily_diet_plan as brkfast ON (brkfast.breakfast = recipe.recipe_ID)
LEFT JOIN daily_diet_plan as lunch ON (lunch.lunch = recipe.recipe_ID)
LEFT JOIN daily_diet_plan as dinner ON (dinner.dinner = recipe.recipe_ID) order by recipe.recipe_name;
【问题讨论】:
-
您是否考虑过规范化您的表以避免三重连接?
-
Link to ERD 您建议对此 ERD 进行哪些修订?
-
将三餐标准化 7 天将导致:weekly_diet_plan(WDP_ID PK,附加列?)和 daily_diet_plan(WDP_ID FK 参考 (WDP. WDP_ID),day_of_week byteint check(day_of_week in (1,2,3,4,5,6,7)/*周一到周日(枚举?)*/,meal_of_day byteint check(time_of_day in (1,2,3)/ * 早餐/午餐/晚餐(枚举?)* /,食谱 FK 参考 (recipes.recipe_ID),PK (WPD_ID,day_of_week,meal_of_day)) 您可以轻松添加 下午茶时间
-
非常感谢!这有点难以理解,但当我画出 ERD 时,我看到了你建议的结构。如果不是太麻烦,您能否具体指出我的旧 ERD 中出了什么问题以及它是什么类型的依赖项?我的教授已经批准了这个项目,我认为我不太了解我原来的 ERD 的非规范化。再次,非常感谢你。这都是非常吸引人的材料,我感谢你帮助我学习。 :)
-
恕我直言,您违反了 1st NF,有重复的日期名称和膳食名称组。