2017-01-18 24 views
0

我有兩個表。稱他們爲罐子和餅乾。一個cookie有一個jar,一個jar有零個或多個cookie。 cookies表格有一個供參考的cookies.jar_id字段。如何在連接中獲得count()?

我想要的是所有具有cookie的罐子(不包括具有零餅乾的罐子)的列表,以及每個罐子中cookie的數量。

可能有數百萬個罐子和數百萬個餅乾,因此這對性能非常敏感。 99%的罐子裏有零餅乾,而那些有餅乾的可能有幾百個,所以我真的需要排除空罐子,而不是爲每個餅乾返回一行。

我敢肯定,這可以通過加入以某種方式完成,但我很難過。

+0

答案是使用'GROUP BY' – Eric

回答

4
select jars.jar_id, count(*) 
from jars 
inner join cookies 
on cookies.jar_id = jars.jar_id 
group by jars.jar_id 

應該有cookies.jar_id上的索引。更甚至有從cookies.jar_id的外鍵jars.jar_id

如果你想從罐子表添加其他列的結果,使用MAX()聚合函數:

select jars.jar_id, Max(jars.jar_name), count(*) 
from jars 
inner join cookies 
on cookies.jar_id = jars.jar_id 
group by jars.jar_id 
+0

無需查詢「罐子」表 –

+3

不是這個結果集的,是的。但接下來的問題將是如何也有罐子名稱;-) – NineBerry

+0

好吧,不知道這種需求,無論如何執行計劃將更加複雜,將需要更多的時間來運行。他想要高效的東西。 –

5

你居然只需要查詢「曲奇」表:

Select jar_id, count(*) as NumberOfCookies 
From cookies 
Where jar_id is not null 
Group by jar_id 
+0

'一個cookie有一個罐子',應該暗示jar_id在cookies表中始終不爲空 – Eric

+1

該查詢將通過jar將cookie分組,而忽略沒有罐子的cookie(如果有的話)。 –

+0

我錯了,很好回答:-) –