2013-10-07 36 views
3

比方說,我有以下模式涉及非常基本的SQL查詢計數

Company: 
-> company_id 
-> company_name 

Building_to_company: 
-> building_id 
-> company_id 

所以每個建築都有自己的ID以及其中涉及到一個公司一個公司ID。

以下查詢給出了兩列 - 一個用於公司名稱,然後是其相關建築物。

SELECT company.company_name, building_to_company.building_id 
FROM company, building_to_company 
WHERE company.company_id = building_to_company.company_id; 

返回的表會是這個樣子:

Company Name | Building Id 
Smith Banking 2001 
Smith Banking 0034 
Smith Banking 0101 
Smith Banking 4055 
Reynolds  8191 
TradeCo  7119 
TradeCo  8510 

所以,這一切很簡單。

但我需要做一些有點不同的事情。我需要2列。一個用於公司名稱,然後是右側所擁有的建築物數量。然後爲了一點額外的挑戰,我只想列出3個或更少建築物的公司。

在這一點上,我所做的唯一真正的進展是上面的查詢。我知道我有些如何使用building_id列來計算與每個公司相關的建築物數量。然後在那一點上,我可以通過使用類似的東西來限制東西WHERE x < 4

+1

這是什麼樣的SQL? SQL服務器或不? – iceheaven31

+0

嘗試羣由公司_id有計數(*)<4 – Jianhong

+0

@ iceheaven31 MySql – user2079802

回答

4

你已經基本上已經用語言表達了它。假設company_name是獨一無二的,你必須添加到您的解釋,得到它的工作是GROUP BY條款:

SELECT company.company_name, COUNT(building_to_company.building_id) 
FROM company 
INNER JOIN building_to_company 
    ON company.company_id = building_to_company.company_id 
GROUP BY company.company_name 

SQL Fiddle demo of this query in action


將其限制在企業與3個或以下的建築物,關鍵是你必須使用HAVING條款而不是WHERE。這是因爲您想根據彙總結果進行篩選(COUNT);簡單地說,WHERE過濾器聚集之前來HAVING跟從:

SELECT company.company_name, COUNT(building_to_company.building_id) 
FROM company 
INNER JOIN building_to_company 
    ON company.company_id = building_to_company.company_id 
GROUP BY company.company_name 
HAVING COUNT(building_to_company.building_id) < 4 

SQL Fiddle demo of this query in action

+0

很好的回答,+1。 – Brian

1

我想你想是這樣的

SELECT c.company_name, count(b.building_id) 
FROM 
    company as c, 
    building_to_company as b 
WHERE c.company_id = b.company_id 
GROUP BY c.company_name; 
1

使用下面的SQL語句找到公司名稱與自己的建築物數量按降序排列。

SELECT company.company_name, count(building_to_company.building_id) 
FROM company (nolock), building_to_company(nolock) 
WHERE company.company_id = building_to_company.company_id 
group by company.company_name 
having count(building_to_company.building_id)<=3 
order by count(building_to_company.building_id) desc 

請讓我知道你是否有任何問題。謝謝