【问题标题】:Getting individual counts of a tables column after joining other tables加入其他表后获取表列的单个计数
【发布时间】:2010-07-27 03:11:02
【问题描述】:

在加入其他列后,我无法准确计算列数。当一个列被加入时,我仍然希望对它正在加入的表有一个 DISTINCT 计数。

餐厅有多餐,餐食有多个食物组,食物组有多种成分。

通过餐厅 ID,我希望能够计算餐厅有多少餐点、食物组和配料。

当我加入 food_groups 时,用餐数量也会增加(我知道这是自然行为,我只是不明白如何获得我需要的东西。)我尝试了 DISTINCT 和我发现的其他东西,但似乎没有任何作用。我想将其保留为一个查询,而不是将其拆分为多个查询。

SELECT 
    COUNT(meals.id) AS countMeals,
    COUNT(food_groups.id) AS countGroups,
    COUNT(ingrediants.id) AS countIngrediants
FROM 
    restaurants 
INNER JOIN 
    meals ON restaurants.id = meals.restaurant_id
INNER JOIN
    food_groups ON meals.id = food_groups.meal_id 
INNER JOIN
    ingrediants ON food_groups.id = ingrediants.food_group_id     
WHERE 
    restaurants.id='43'
GROUP BY
    restaurants.id

谢谢!

【问题讨论】:

  • 如果你的餐厅有no邮件,你应该使用LEFT JOIN否则你不会知道!

标签: sql mysql


【解决方案1】:

DISTINCT 进入计数

SELECT 
    COUNT(DISTINCT meals.id) AS countMeals,
    COUNT(DISTINCT food_groups.id) AS countGroups,
    COUNT(DISTINCT ingrediants.id) AS countIngrediants
FROM 
    restaurants 
INNER JOIN 
    meals ON restaurants.id = meals.restaurant_id
INNER JOIN
    food_groups ON meals.id = food_groups.meal_id 
INNER JOIN
    ingrediants ON food_groups.id = ingrediants.food_group_id     
WHERE 
    restaurants.id='43'
GROUP BY
    restaurants.id

【讨论】:

    【解决方案2】:

    我认为,您将不得不进行子查询。比如:

    SELECT 
        (SELECT COUNT(1) FROM meals m WHERE m.restaurant_id = r.id) AS countMeals,
        (SELECT COUNT(1) FROM food_groups fg WHERE fg.meal_id = m.id) AS countGroups,
        (SELECT COUNT(1) FROM ingrediants i WHERE i.food_group_id = fg.id) AS countGroups
    FROM restaurants r
    

    【讨论】:

      【解决方案3】:

      您将 DISTINCT 放在哪里以及放在哪些列上?使用 COUNT() 时,您需要在括号 内执行不同的操作,您需要在单个列上执行此操作,该列对于您要计算的内容是不同的。例如:

      SELECT
          COUNT(DISTINCT M.id) AS count_meals,
          COUNT(DISTINCT FG.id) AS count_food_groups,
          COUNT(DISTINCT I.id) AS count_ingredients
      FROM
          Restaurants R
      INNER JOIN Meals M ON M.restaurant_id = R.id
      INNER JOIN Food_Groups FG ON FG.meal_id = M.id
      INNER JOIN Ingredients I ON I.food_group_id = FG.id
      WHERE 
          R.id='43'
      

      由于您选择的是一家餐厅,因此您不需要 GROUP BY。此外,除非这是非英语语言,否则我认为您拼错了成分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        相关资源
        最近更新 更多