2011-06-30 115 views
1

表1:食品新到SQL - 需要帮助的查询

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的变量,它是食品在报告中所有报告的总数量。

我一直想:

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 
+0

差不多吧,只是移动'Count'子选择内。 – Magnus

+0

提到你的答案寻求帮助,谢谢。为什么人们会选择使用INNER JOIN而不是我们所做的方式? – Chris

+0

我不知道,它更容易与子查询编写(因为我们有),因为你不必指定列的所有组(可以很多),如果你没有在主键上分组子查询将会有更好的表现。 – Magnus

回答

0
SELECT 
    food.id AS foodId, 
    food.name AS foodName, 
    (SELECT COUNT(*) FROM reports WHERE reports.food_id = food.id) 
FROM 
    food 
3
SELECT food.name, 
     COUNT(*) as food_count 
    FROM reports 
     INNER JOIN food ON reports.food_id = food.id 
    GROUP BY food.name; 
2

您可以通过使用GROUP BY实现这一目标。

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  
+0

这就是我正在寻找的优化...新的groupby是正确的树;) –

0

有可能是一种优化的方式来做到这一点,但这里有一个查询,应该让您的结果

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