MySQL:计算值的出现次数

时间:2018-06-10 19:57:39

标签: mysql sql

我希望能够获得数据,显示每家酒店有多少房型。 像这样:

HotelName  RoomName               NumOfRooms
--------------------------------------------------------------------
Hotel 1    Queen Guest Room       23
Hotel 1    Queen Guest Room Plus  17
(7+ RoomNames for Hotel 1)
...
Hotel 2    Queen Guest Room       14
Hotel 2    Queen Guest Room Plus  9
(7+ RoomNames for Hotel 2)
...
Hotel 3    Queen Guest Room       9
Hotel 3    Queen Guest Room Plus  6
(7+ RoomNames for Hotel 3)

我只是到目前为止:

SELECT `Hotel`.HotelName, `RoomType`.RoomName FROM `Hotel`
RIGHT JOIN `Room` ON `Hotel`.HotelID = `Room`.HotelID
RIGHT JOIN `RoomType` ON `Room`.TypeID = `RoomType`.TypeID
GROUP BY `RoomID` ORDER BY `RoomID` ASC;

它只会显示每个房间的位置以及它的类型,我只是无法弄清楚如何使用它,我相信我应该使用嵌套查询,但我不知道该怎么做。

设置

我有一个酒店数据库,有三家酒店,每个酒店都有房间,每个房间是九种类型之一(客房,客房加,单人客房等......)

地图:

HotelID  HotelName
------------------
1        Hotel 1
2        Hotel 2
3        Hotel 3

RoomType:

TypeID  RoomName               
-----------------------------
1       Queen Guest Room       
2       Queen Guest Room Plus  
3       Single  Guest Room     

6 more...

间:

RoomID  HotelID TypeID
----------------------
1       1       3     
2       1       3     
3       1       3     

150+ more...

我非常感谢所有帮助,谢谢你!

1 个答案:

答案 0 :(得分:0)

CROSS JOIN HotelRoomType获取酒店和房型的所有组合。然后LEFT JOIN Room将所有房间添加到指定的酒店房间类型组合。如果酒店没有NULL类型的房间将被添加。然后使用GROUP BYcount()来计算酒店所拥有的房型类型。

SELECT h.HotelName,
       rt.RoomName,
       count(r.TypeID)
       FROM Hotel h
            CROSS JOIN RoomType rt
            LEFT JOIN Room r
                      ON r.HotelID = h.HotelID
                         AND r.TypeID = rt.TypeID
       GROUP BY h.HotelName,
                h.HotelID,
                rt.RoomName,
                rt.TypeID;

除非使用count(*) count(),否则不会计算NULL个值。因此,当酒店没有相应类型的房间时,使用count(r.TypeID)我们会得到0。

(注意:我已将h.HotelIDrt.TypeId添加到GROUP BY,因为可能有多个酒店或房间类型具有相同名称。)