如何编写SQL来返回连接数据的出现次数?

时间:2015-06-15 16:32:38

标签: mysql sql join count group-by

我有一张房子的桌子和窗户的连接表。所以一个房子可以有0个或更多的窗户,没有限制(这是一个人为的例子,但它模拟了我正在做的工作)。

我希望能够编写一个SQL查询,返回具有0个窗口的房屋计数,具有1个窗口的计数,具有2个窗口的计数等。

即:

# Windows | # Houses
--------------------
0         | 27
1         | 18
2         | 45
3         | 7
etc.

表格非常简单。窗户有一个" house_id"引用House表的ID字段的外键。

我知道这应该很容易,但对于我的生活,我无法弄明白吗?

谢谢,

5 个答案:

答案 0 :(得分:1)

您可以使用以下查询来获得所需的输出:

SELECT cnt AS `# Windows`, COUNT(*) AS `# Houses`
FROM (
SELECT house_id, COUNT(*) AS cnt
FROM Window
GROUP BY house_id ) t
GROUP BY cnt

这是标准的SQL,因此它应该适用于大多数RDMBS。

如果您希望# Windows字段包含所有可能的数字,从0开始到最大窗口数,那么您必须创建一个计数表和LEFT JOIN,其中包含一个派生表查询上面。

Demo here

答案 1 :(得分:0)

您需要添加“GROUP BY”子句。 请查看此问题out.

答案 2 :(得分:0)

关键是使用having子句:

select count(*) 
from(select house from TableName
     group by house
     having count(*) = 1) t

1替换为您感兴趣的任何号码。

答案 3 :(得分:0)

以下内容应该是您正在寻找的内容:

SELECT NUM_WINDOWS AS "# Windows", COUNT(*) AS "# Houses"
  FROM (SELECT HOUSE_ID, COUNT(*) AS NUM_WINDOWS
          FROM WINDOW
          GROUP BY HOUSE_ID)
  GROUP BY NUM_WINDOWS

祝你好运。

答案 4 :(得分:0)

根据你所说的,应该这样做:

子查询获取一个房屋列表以及每个房屋的窗口数量。接下来是另一种方式,房子有多少窗户。

Select Window_ct, COUNT(house_id) House_Ct
From (select h.House_id, COUNT(w.Windows_Id) Window_Ct
        from Houses h
            inner join Windowz w
            On H.House_id = W.House.id
        Group by h.House_id) t
Group by Window_Ct
Order by 2