非常基本的SQL查询涉及计数

时间:2013-10-07 02:46:44

标签: mysql 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列上使用count并计算与每个公司相关的建筑物数量。然后在那时我可以通过使用像WHERE x < 4

这样的东西来限制事物

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分:1)

使用Below 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

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