MySQL如何排序一个表的最低价格/价格,并且只显示最低的名称?

时间:2019-06-27 21:28:29

标签: mysql sql database

我想要一个包含酒店房间的数据库,供客人预订。我想显示每个城市最便宜的酒店客房,如果价格相同,我想显示两个城市。我该怎么做呢。我是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     |

2 个答案:

答案 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;