MySQL 4表作为主表加入和分组

时间:2017-06-23 09:42:48

标签: mysql join

我有4张桌子。我想知道是否可以通过任何加入获得最低酒店价格。有一个示例数据。

Table: hotels

            id   name               country         city        phone               
            1   P Hotel              France         Paris       055555555
            2   C Hotel              Portuqal       Lisbon      545489485
            3   D Hotel              ........       ......      ........
            4   E Hotel              ........       ......      ........
            .
            .
            .

表:room_types

            id           name     
----------------------------------------------  
            1              Standart Room       
            2              Deluxe Room         
            3              B-Plus               
            4              Villa                

表:hotel_rooms

            id          hotel_id    room_id
----------------------------------------------  
            1              1          1
            2              1          3
            3              1          4
            4              2          4
            5              2          2
            6              3          1
            7              3          2
            8              4          1

表:价格

            id          price_pp        price_tp    discount    hotel_rooms_id
----------------------------------------------------------------------------------
            1              123.00       323.00         15           1
            2              212.34       112.00         24           2
            3              12.50        62.00          29           3
            4              523.00       323.00         15           4
            5              412.34       112.00         24           5
            6              62.50        62.00          29           6
            .
            .
            .
            .

哪种房型无关紧要我只需要酒店的最低价格。我想得到这样的结果:

表:价格

        id   name               country         city        phone       price_pp        price_tp    discount    
        ---------------------------------------------------------------------------------------------------
        1   P Hotel              France         Paris       055555555     12.50          62.00         29
        2   C Hotel              Portuqal       Lisbon      545489485     412.34         112.00        24       
        3   D Hotel              ........       ......      ........
        4   E Hotel 

更新 这就是我尝试过的,但结果只显示酒店和MIN(price.price_pp)我还希望从价格中获得其他列。

 SELECT hotels.*, MIN(prices.price_pp)
    FROM hotels
        LEFT JOIN hotel_rooms
            ON hotels.id = hotel_rooms.hotel_id    
        LEFT JOIN prices
            ON hotel_rooms.id = prices.hotel_rooms_id
    GROUP BY hotels.id  

2 个答案:

答案 0 :(得分:0)

只需将2more列添加到您的选择列表中即可。像这样的东西 -

SELECT hotels.*, MIN(prices.price_pp), MIN(prices.price_tp), MIN(prices.discount)
FROM hotels
    LEFT JOIN hotel_rooms
        ON hotels.id = hotel_rooms.hotel_id    
    LEFT JOIN prices
        ON hotel_rooms.id = prices.hotel_rooms_id
GROUP BY hotels.id

希望这有帮助。

答案 1 :(得分:0)

我猜你正在寻找一个每个酒店显示一排的结果集,其中包含酒店的详细信息和酒店最便宜的房间。但这是我的猜测。

我也被迫猜测你的人际关系是如何运作的。 prices.hotel_rooms_idhotel_rooms.id有关吗?

专家提示:您花在指定问题上的时间越多,花在尝试解决问题上的时间就越少。

这里有两个步骤:

  1. 找到每家酒店中最便宜的房间的hotel_idprice_pp值。
  2. 使用JOIN来检索酒店和房间的详细信息。
  3. 查找每家酒店的最低价格MIN(price_pp)

                     SELECT MIN(p.price_pp) price, r.hotel_id
                       FROM prices p
                       JOIN hotel_rooms r ON p.hotel_rooms_id = r.id
                      GROUP BY r.hotel_id
    

    自己运行该查询。说服自己它有效。

    然后您可以将其用作子查询来检索您的详细信息。

     SELECT hotels.*, prices.*
       FROM hotels
       JOIN hotel_rooms ON hotels.id = hotel_rooms.hotel_id
       JOIN prices ON hotel_rooms.id = prices.hotel_rooms_id
       JOIN (
                         SELECT MIN(p.price_pp) price, r.hotel_id
                           FROM prices p
                           JOIN hotel_rooms r ON p.hotel_rooms_id = r.id
                          GROUP BY r.hotel_id
            ) x  ON prices.price_pp = x.price 
                AND hotel_rooms.hotel_id = x.hotel_id
    

    这是经典查询模式的示例:查找包含极值(最小值,最大值等)的表中行的详细信息。最后两行中的ON子句用于提取有趣的细节行。