我想要一个包含酒店房间的数据库,供客人预订。我想显示每个城市最便宜的酒店客房,如果价格相同,我想显示两个城市。我该怎么做呢。我是Sql的初学者,因此无法解决此问题。
我目前拥有的东西:
| type | pID |city |price |
|:-----------|------------:|:------------:|----------
| B | COD12 | Canvas | 240 |
| B | COD40 | Canvas | 200 |
| B | KHOD20 | Kentucky | 40 |
| B | KHOD60 | Kentucky | 40 |
我想要什么:
| type | pID |city |price |
|:-----------|------------:|:------------:|----------
| B | COD40 | Canvas | 200 |
| B | KHOD20 | Kentucky | 40 |
| B | KHOD60 | Kentucky | 40 |
答案 0 :(得分:0)
此SQL给您想要的描述
select type,pID,city,price
from your table
where (city, price)
in (select city, min(price)
from your table
group by 1)
子查询找出每个城市的最低价格,将城市和价格信息传递给主查询作为过滤器。使用此过滤器主查询可返回与城市/价格对匹配的所有行。
答案 1 :(得分:0)
从性能的角度来看,将mdem7的答案与相关子查询进行比较会很有趣:
select t.*
from t
where t.price = (select min(t2.price) from t t2 where t2.city = t.city);
这可以利用(city, price)
上的索引。
在MySQL 8+中,这是窗口函数的好地方:
select t.*
from (select t.*,
rank() over (partition by city order by price) as seqnum
from t
) t
where seqnum = 1;