Mysql SQL新手-需要查询帮助吗

Mysql SQL新手-需要查询帮助吗,mysql,sql,Mysql,Sql,表1:食品 id name ------- 1 Hot-dog 2 Sandwich 3 Apple 表2:报告 id food_id date ---------------- 1 1 2010-01-01 2 1 2010-02-01 3 2 2011-02-01 我如何设计一个查询,用一个名为numReports的变量选择食物表中的所有食物,numReports是食物项在报告中的所有报告的总数 我一直在尝试: SELECT food.

表1:食品

id name
-------
1 Hot-dog
2 Sandwich
3 Apple
表2:报告

id food_id date
----------------
1     1    2010-01-01
2     1    2010-02-01
3     2    2011-02-01
我如何设计一个查询,用一个名为numReports的变量选择食物表中的所有食物,numReports是食物项在报告中的所有报告的总数

我一直在尝试:

SELECT 
    food.id AS foodId, 
    food.name AS foodName,
    count(
        SELECT * FROM reports WHERE reports.food_id=food.id
        ) AS numReports
FROM 
    food
输出:

id name numReports
-------------------
1 Hot-dog  2
2 Sandwich 1
3 Apple    0

您可以通过使用GROUPBY来实现这一点

SELECT     food.id AS foodId,
           food.name As foodName,
           Count(*) AS numReports
FROM       food
INNER JOIN reports
ON         food.id = reports.food_id
GROUP BY   food.id,
           food.name
您还可以使用相关子查询

SELECT     food.id AS foodId,
           food.name As foodName,
           (SELECT Count(*) FROM reports WHERE food.id = reports.food_id) AS numReports
FROM       food    

您可以通过使用GROUPBY来实现这一点

SELECT     food.id AS foodId,
           food.name As foodName,
           Count(*) AS numReports
FROM       food
INNER JOIN reports
ON         food.id = reports.food_id
GROUP BY   food.id,
           food.name
您还可以使用相关子查询

SELECT     food.id AS foodId,
           food.name As foodName,
           (SELECT Count(*) FROM reports WHERE food.id = reports.food_id) AS numReports
FROM       food    

也许有一种优化的方法可以做到这一点,但这里有一个查询应该可以得到您的结果

select 
  food.id, 
  food.name,
  reports.reportcount
from 
  food
inner join
  (select 
    food_id, 
    count(food_id) reportcount
    from 
      report
    group by (food_id)) as reports
on food.id=reports.food_id

也许有一种优化的方法可以做到这一点,但这里有一个查询应该可以得到您的结果

select 
  food.id, 
  food.name,
  reports.reportcount
from 
  food
inner join
  (select 
    food_id, 
    count(food_id) reportcount
    from 
      report
    group by (food_id)) as reports
on food.id=reports.food_id

这就是我一直在寻找的优化……新groupby是最适合的树;)这就是我一直在寻找的优化……新groupby是最适合的树;)几乎正确,只需在子选项中移动
计数即可。请参考您的答案以获得帮助,谢谢。为什么人们会选择使用内部联接而不是我们的方式呢?我真的不知道,使用子查询(正如我们所做的那样)更容易编写,因为您不必指定所有按列分组(可以是多列),如果您不按主键分组,子查询将具有更好的性能。几乎正确,只需在子选项中移动
计数
。请参考您的答案寻求帮助,谢谢。为什么人们会选择使用内部联接而不是我们的方式呢?我真的不知道,使用子查询(正如我们所做的那样)更容易编写,因为您不必指定所有分组列(可以是多个列),如果您不按主键分组,子查询将具有更好的性能。