3

假设我有以下架构

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 列上使用 count 并计算与每个公司关联的建筑物的数量。然后到那时我可以通过使用类似的东西来限制事情WHERE x < 4

4

3 回答 3

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 演示正在运行


要将其限制为拥有 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 演示正在运行

于 2013-10-07T02:51:01.983 回答
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;
于 2013-10-07T02:51:11.607 回答
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

如果您有任何问题,请告诉我。谢谢

于 2013-10-07T03:04:08.407 回答