【问题标题】:SQLite join command 4 tablesSQLite 连接命令 4 个表
【发布时间】:2013-02-25 13:15:58
【问题描述】:

我是 sql 的小菜鸟,我需要一些帮助。 我有 3-4 个表,我想创建一个 sqlite 命令来返回一些行。表格如下。

餐桌:餐厅

| Name | menuID | REFERENCES [Menu]([menuID])|

表格:菜单

| MenuID | Name |

表格:成分

| IngredientID | Name |

表格:Food_Incl_ingredient

| FoodIncIngredientID | FoodID REFERENCES [Food][FoodID] | IngredientID REFERENCES [Ingredient]([IngredientID])|

餐桌:食物

| FoodID | Name | Type | MenuID REFERENCES [Menu][MenuID]|

如果他们没有我会说的成分,我想查询以返回餐厅名称、食物名称和食物类型。 谢谢。

餐桌餐厅:

| Name     | MenuId |
  Goodys        2
  Koumbaris     1

表格菜单:

| MenuID |     Name     |
    1      koumbarisMenu
    2      goodysMenu

餐桌食物:

| FoodID |     Name      |  Type  | MenuID |
   29     Chef's Salad    Starter     2
   31     Mama's Salad    Starter     2
   30     Ceasar's Salad  Starter     2

餐桌食品_Incl_ingredient:

| FoodInclIngredientID | FoodID | IngredientID |
          1               29           1
          6               31           1
          8               30           1

餐桌成分:

| IngredientID |  Name  |
    1         Cereals
    2         Shellfish

SQL 查询:

SELECT Restaurant.Name, Food.Name, Food.Type
FROM Restaurant
INNER JOIN Menu ON Restaurant.menuID = Menu.MenuID  
INNER JOIN Food ON Menu.MenuID = Food.MenuID  
INNER JOIN Food_Incl_ingredient ON Food.FoodID = Food_Incl_ingredient.FoodID  
INNER JOIN Ingredient ON Food_Incl_ingredient.FoodInclIngredientID = Ingredient.IngredientID  
WHERE Ingredient.Name == 'Cereals'  

预期结果:

| Name |      Name      |  Type  |
 Goodys  Chef's Salad     Starter
 Goodys  Mama's Salad     Starter
 Goodys  Ceasar's Salad   Starter

我得到的唯一结果是第一行。

【问题讨论】:

  • 既然你说你是新手,我就听说过《Teach Yourself SQL in 10 Minutes》这本书的好话。学习基础知识可以避免很多摸索。
  • 没有成分的部分不清楚。
  • 也展示你的一些努力。只要你也解决这个问题,人们就会在这里寻求帮助。
  • 哎呀。这是一个愚蠢的 ;) ... 查看查询的第 6 行。您正在加入ON Food_Incl_ingredient.FoodInclIngredientID = ...,但您应该加入ON Food_Incl_ingredient.IngredientID = ...。还有一个小提示:在最后一行使用= 而不是==
  • 天啊!我简直不敢相信!谢谢,非常感谢。我不敢相信我没有看到它。 :)

标签: sql database sqlite join


【解决方案1】:

问题出在哪里?只需加入您需要的所有表格,然后说WHERE Ingredient.Name != 'meat'

SELECT Restaurant.Name, Food.Name, Food.Type
FROM Restaurant
  JOIN Menu ON Restaurant.menuID = Menu.MenuID
  JOIN Food ON Menu.MenuID = Food.MenuID
  JOIN Food_Incl_ingredient ON Food.FoodID = Food_Incl_ingredient.FoodIncIngredientID
  JOIN Ingredient ON Food_Incl_ingredient.FoodIncIngredientID = Ingredient.Ingredient.ID
WHERE Ingredient.Name != 'meat'

我希望我了解您的帖子中的表名是什么,主键是什么;)

【讨论】:

  • 感谢您的帮助。现在奇怪的是为什么它只给我一种食物。在数据库中,它们至少是我拥有的 10 种含有谷物成分的食物。我已经使它等于谷物
  • 在您的问题中,您似乎想要拥有所有没有该成分的 Restaurant+Food+Type。 ...我的查询为您提供了所有不含肉的食物;)因此,如果您不想拥有所有含肉的食物,则必须在最后一行使用== 而不是!=。跨度>
  • 是的,我已经放 == 放不正确。它只返回一个带食物的餐厅,而不是 10 个包含谷物的餐厅
  • 还有一个问题,为什么我们选择 FROM Restaurants 而不是 other table?
  • 基本上你可以随意选择FROM。我只是想指出一个明确的JOIN 结构:餐厅 -> 菜单 -> 食物 -> Food_Incl_ingredient -> 成分。
【解决方案2】:

...if they don't have the ingredient i will say

这是一个非常基本的结构,让您可以编写一个查询来说明餐厅是否需要为其菜单购买食材

您通常会构建一些东西,以便餐厅可以有多个菜单,例如早餐、午餐、晚餐,也可能是餐饮或派对。

注意最后的 LEFT JOIN 和 COALESCE 的使用。

Restaurant
id
restaurantname

Menu
id
menuname   e.g. Breakfast, Lunch, Dinner, Catering, Party, Special Cultural Holiday

Dish
id
dishname   

Ingredient
id
ingredientname

-- 一道菜有一种或多种成分

Dish_Ingredients
dishid
ingredientid

-- 一个菜单有一个或多个菜

MenuDish
menuid
dishid

-- 一家餐厅有一个或多个菜单

RestaurantMenu
restaurantid
menuid

-- 一家餐厅备有一份食材清单

RestaurantIngredients
restaurantid
ingredientid
quantityOnHand  

--left join 将导致当盘子调用库存中没有记录的成分时返回 NULL 值;因此 COALESCE()

    select restaurantname, menuname, dishname, ingredientname, quantityOnHand
    from restaurant R 
    inner join restaurantmenu RM on R.id = RM.restaurantid
    inner join menu M on RM.menuid = M.id
    inner join menudish MD on MD.menuid = M.id
    inner join dish D on MD.dishid = D.id
    inner join dishingredient DI on DI.dishid = D.id
    inner join ingredients I on DI.ingredientid  = I.id

    LEFT JOIN

    restaurantingredients RI  on RI.ingredientid = I.id and RI.restaurantid = R.id   
    where Coalesce(quantityOnHand, 'none') as CurrentInventory

【讨论】:

  • 这个复杂的查询有点难以理解,但我会尝试管理这是什么,谢谢。
  • 这不是一个复杂的查询,真的。这是相同类型的简单连接,多次发生在多个表中,仅此而已。一旦您了解了“链接”诸如 MenuDish 和 DishIngredients 之类的表的目的,您就会明白一切。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2018-10-23
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多