сложный SQL-запрос из 4 таблиц - PullRequest
1 голос
/ 28 января 2012

Я разрабатываю интерактивный путеводитель со множеством отелей. Каждый отель относится к определенной категории, имеет много типов номеров, и каждый номер в отеле имеет разную цену за сезон. Я хочу сделать сложный запрос из 4 таблиц, чтобы получить общее количество отелей в категории отелей , где минимальная цена каждого номера в отеле находится между 2 значениями, которые корректируются с помощью ползунка .

Мои таблицы выглядят так:

  • Категории
  • id_category
  • category_name

  • Отели
  • id_hotel
  • hotel_name
  • category_id
  • ......

  • hotels_room_types
  • id_hotels_room_type
  • hotel_id
  • room_type_id
  • ......

  • hotels_room_types_seasons
  • hotels_room_types_id
  • season_id
  • цена
  • ......

например, некоторые значения category_name: отели, квартиры, общежития
Я хотел бы, чтобы в моей таблице результатов было два поля, например:

Отели 32
квартиры 0
хостелы 5


Я попробовал следующий запрос, но он возвращает общее количество всех отелей в каждой категории, а не количество гостиниц, где минимальная цена их номеров находится в диапазоне цен.

SELECT c.category_name, count( DISTINCT id_hotel ) , min( price ) min_price
FROM categories c
LEFT JOIN hotels w ON ( c.id_category = w.category_id ) 
LEFT JOIN (
hotels_room_types
INNER JOIN hotels_room_types_seasons ON hotels_room_types.id_hotels_room_types = hotels_room_types_seasons.hotels_room_types_id) 
ON w.id_hotel = hotels_room_types.hotel_id
GROUP BY c.category_name
HAVING min_price >=10 AND min_price <=130

Может ли кто-нибудь помочь мне, как написать соответствующий запрос?
Спасибо !!!

Ответы [ 2 ]

1 голос
/ 28 января 2012
SELECT  Categories.Name, COUNT(DISTINCT ID_Hotel) [Count]
FROM    Hotels
        INNER JOIN Categories
            ON Category_ID = ID_Category
        INNER JOIN
        (   SELECT  Hotel_ID, MIN(Price) [LowestPrice]
            FROM    hotels_room_types
                    INNER JOIN hotels_room_types_seasons
                        ON id_hotels_room_type = hotels_room_types_id
            -- CONSIDER FILTERING BY SEASON HERE
            GROUP BY Hotel_ID
        ) price
            ON price.Hotel_ID = Hotels.ID_Hotel
WHERE   LowestPrice BETWEEN 10 AND 130 -- OR WHATEVER YOUR PARAMETERS ARE
GROUP BY Categories.Name

Я понятия не имею, какую СУБД вы используете, но я не знаю, где будет работать ваш запрос.Проблема, с которой вы столкнулись при минимальной цене (я полагаю), заключается в том, что вы применяете логику после группировки по категориям, то есть вы учитываете все отели, где в категории самая низкая цена, между 10 и 130, а не там, где в отеле есть номерс самой низкой ценой от 10 до 130.

0 голосов
/ 28 января 2012
select
      c.Category_name,
      count(*) NumHotels
   from
      ( select distinct
              byRoomType.hotel_id
           from
              hotels_room_types_seasons bySeason
                 join hotels_room_types byRoomType
                    on bySeason.hotels_room_types_id = byRoomType.id_hotels_room_type
           where
              bySeason.Price between LowPriceParameter and HighPriceParameter 
      ) QualifiedHotels

         join Hotels
            on QualifiedHotels.hotel_id = Hotels.id_hotel

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