【问题标题】:How do you join several columns from one entity to single column in a separate entity?如何将一个实体中的多个列连接到一个单独实体中的单个列?
【发布时间】: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,有重复的日期名称和膳食名称组。

标签: mysql sql join


【解决方案1】:

更新您的查询(我添加了差异别名:

SELECT 
recipe.recipe_name 
FROM 
recipe 
INNER JOIN daily_diet_plan as brkfast ON (brkfast.breakfast = recipe.recipe_ID)
INNER JOIN daily_diet_plan as lunch ON (lunch.lunch = recipe.recipe_ID) 
INNER JOIN daily_diet_plan as dinner ON (dinner.dinner = recipe.recipe_ID);

【讨论】:

  • 虽然这没有错误,但它返回一个空集。你知道为什么会这样吗?
  • 而不是内连接使用左连接
  • 我还有一个问题。有没有办法按列的顺序对其进行排序?给出的结果是 Burritos、Peppers、Breakfast slice... 但按照您当天吃的东西的顺序,我希望列表显示 Breakfast Slice、Burritos、Peppers。我真的不知道怎么说按第 2 列,第 3 列,然后从表 daily_diet_plan 中的第 4 列排序
  • SELECT recipe.recipe_name FROM recipe INNER JOIN daily_diet_plan as brkfast ON (brkfast.breakfast = recipe.recipe_ID) INNER JOIN daily_diet_plan 作为午餐 ON (lunch.lunch = recipe.recipe_ID) INNER JOIN daily_diet_plan 作为晚餐 ON (dinner.dinner = recipe.recipe_ID) 按recipe.recipe_name 排序;
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2012-01-03
  • 2014-07-09
相关资源
最近更新 更多