【问题标题】:complex sql query from 4 tables来自 4 个表的复杂 sql 查询
【发布时间】:2012-01-28 11:17:43
【问题描述】:

我正在开发一个包含很多酒店的在线旅游指南。每个酒店都属于一个特定的类别,有很多房间类型,每个酒店房间每个季节都有不同的价格。我想从 4 个表中进行复杂查询,以获得每个酒店类别的酒店总数其中每个酒店房间的最低价格在 2 个由滑块调整的值之间

我的表格如下:

  • 类别
  • id_category
  • 类别名称

  • 酒店
  • id_hotel
  • 酒店名称
  • 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

谁能帮助我如何编写适当的查询?
谢谢!!!

【问题讨论】:

  • 我看不出你是如何应用任何特定季节的。一间酒店的最低价格可能是非旺季 100 美元和旺季 400 美元。另外,您真的想要最低价格吗?而不是最高价格?如果我对支出持谨慎态度,我想知道我可能会遇到的最高价格,并知道有低于此价格的价格,但 MIN() 也可以。

标签: sql count left-join min


【解决方案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之间。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多