首页 > 解决方案 > MySQL:计算值的出现次数

问题描述

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

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;

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

设置

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

酒店:

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

房型:

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...

我真的很感激我能得到的所有帮助谢谢!

标签: mysqlsql

解决方案


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.TypeIdGROUP BY因为可能有不止一种酒店或房间类型同名。)


推荐阅读