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_id
和price_pp
值。
使用JOIN
s 检索酒店和房间详细信息。
在每家酒店中查找最低价格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_pp
、price_tp
和discount
的值。这不太对。以上是关于MySQL 4 表作为主表加入和分组的主要内容,如果未能解决你的问题,请参考以下文章