2012-01-28 46 views
0

我正在開發一個有很多酒店的在線旅遊指南。每家酒店都屬於特定類別,房間類型很多,每個酒店房間每個季節的價格都不一樣。我想從4個表中進行復雜的查詢,以獲得每個酒店類別的酒店總數,其中每個酒店房間的最低價格在由滑動條調整的2個值之間。來自4個表格的複雜sql查詢

我的表是這樣的:

  • 分類
  • 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 

任何人都可以幫助我如何編寫適當的查詢?
謝謝!

+0

我不明白你是如何應用任何特定季節的。一家酒店的最低價格可能是100美元的非旺季和400美元的旺季。另外,你真的想要最低的價格?而不是最高價格?如果我對支出持謹慎態度,我會想知道我可能遇到的最高價格,並知道有比這更低的價格,但是MIN()也可以。 – DRapp 2012-01-28 11:33:00

回答

1
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 

我不知道你在用什麼RDBMS,但我不知道你的查詢會在哪裏工作。您使用最低價格(我假設)遇到的問題是因爲您按類別進行分組後應用了邏輯,因此您將計算所有類別價格在10至130之間的酒店,而不是酒店有房間的位置最低價格在10到130之間。

+0

非常感謝!有效!!! – George 2012-01-28 13:56:59

0
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