MySQL: подсчет вхождений значений - PullRequest
0 голосов
/ 10 июня 2018

Я хочу получить данные о количестве номеров в каждом отеле.Примерно так:

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;

Это только показывает, где находится каждая комната и какой она, я простоне могу понять, как это использовать, я считаю, что я должен использовать вложенные запросы, но я не уверен, как это сделать.

Настройка

I 'у нас есть база данных отелей, есть три отеля, в каждом отеле есть номера, и каждый номер имеет один из девяти типов (гостевая комната, гостевая комната плюс, отдельная комната для гостей и т. д.)

Отель:

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

Room:

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

150+ more...

Буду очень признателен за любую помощь, которую смогу получить, спасибо!

1 Ответ

0 голосов
/ 10 июня 2018

CROSS JOIN Hotel и RoomType, чтобы получить все комбинации отелей и типов номеров.Затем LEFT JOIN Room, чтобы добавить все номера к определенной комбинации типа гостиничного номера.Если в отеле нет номера типа NULL, будут добавлены значения.Затем используйте GROUP BY и count(), чтобы получить количество типов номеров, которые есть в отеле.

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.HotelID и rt.TypeId к GROUP BY, поскольку их может быть больше, чемодин отель или тип номера с таким же названием.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...