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

Posted

技术标签:

【中文标题】MySQL 4 表作为主表加入和分组【英文标题】:MySQL 4 Tables Join and Group by as main table 【发布时间】:2017-06-23 09:42:48 【问题描述】:

我有 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(prices.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  

【问题讨论】:

这闻起来像家庭作业。你试过了吗? 你能展示一下你到目前为止所做的尝试吗? 您还没有告诉我们如何计算任何给定房间的价格。您的prices 表包含显示价格和折扣的两列。应该如何解释这些列以得出每行(每个房间)的最低价格? 您写道“我还想从价格中获取其他行”。我想您的意思是“我想从prices 表中获取其他。” @O.Jones 对不起,是价格表中的其他列。 【参考方案1】:

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

我也不得不猜测你们的关系是如何运作的。 prices.hotel_rooms_id 是否与 hotel_rooms.id 相关?

专业提示:您花在明确问题上的时间越多,尝试解决问题的时间就越少。

这里有两个步骤:

    找到每家酒店最便宜的房间的hotel_idprice_pp 值。 使用JOINs 检索酒店和房间详细信息。

在每家酒店中查找最低价格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 子句负责提取有趣的详细信息行。

【讨论】:

我可能在这方面留下了一些错误。 不要只是复制我的答案并使用它。确保你理解它。 非常感谢,你救了我的命。现在我知道下次我应该怎么做也谢谢你。【参考方案2】:

只需在您的选择列表中再添加 2 列。像这样的 -

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

希望这会有所帮助。

【讨论】:

此查询可以从prices 表的不同行中为每家酒店检索price_ppprice_tpdiscount 的值。这不太对。

以上是关于MySQL 4 表作为主表加入和分组的主要内容,如果未能解决你的问题,请参考以下文章

MySQL加入分组没有完美加入

MySQL分组查询

mysql 分组和加入

MySQL 多表查询

mysql数据库约束

MySQL笔记--MySQL分组函数和分组查询