0

我是 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

表 Food_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

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

4

2 回答 2

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'

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

于 2013-02-25T13:21:57.687 回答
0

...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
于 2013-02-25T14:12:22.333 回答