选择数据库中最高和最低的文章,如何?

时间:2019-03-30 14:22:02

标签: mysql sql max aggregate min

具有不同文章的表。任务是选择价格最高的商品和价格最低的商品加上商品编号(主键)

这似乎很简单MAX / MIN,但效果并不理想。

SELECT ArtNr, MAX(Price) AS Most_expensive, MIN(Price) AS CHEAPEST FROM article;

仅显示最便宜商品的商品编号。 我怎样才能解决这个问题?

非常感谢!

4 个答案:

答案 0 :(得分:1)

一种方式:

SELECT ArtNr, MAX(Price), 'Most Expensive'
FROM article
GRoup By ArtNr
union all
SELECT ArtNr, MIN(Price), 'Cheapest'
FROM article
GRoup By ArtNr

答案 1 :(得分:0)

在MySQL 8.0中,您可以使用ROW_NUMBER()

SELECT * FROM (
    SELECT 
        ArtNr, 
        Price, 
        ROW_NUMBER() OVER(ORDER BY Price) rn_asc,
        ROW_NUMBER() OVER(ORDER BY Price DESC) rn_desc
    FROM article
) x WHERE rn_asc = 1 OR rn_desc = 1

子查询为每个产品分配一个排名,按价格的升序或降序排列。外部查询按最高价和最低价过滤。

如果要允许上下关系,可以使用RANK()代替ROW_NUMBER()


在早期的MySQL版本中,您可以使用具有NOT EXISTS条件的相关子查询,例如:

SELECT ArtNr, Price 
FROM article a
WHERE 
    NOT EXISTS (SELECT 1 FROM article a1 WHERE a1.Price > a.price) 
    OR NOT EXISTS (SELECT 1 FROM article a2 WHERE a2.Price < a.price)

答案 2 :(得分:0)

使用IN

实时测试:http://sqlfiddle.com/#!9/686a0f/3

select * 
from article a
where a.price in
(
   SELECT MAX(Price) 
   from article
   union 
   SELECT MIN(Price) 
   from article      
)
order by price;

它只是没有其他列来指示价格是最高还是最低。如果所有价格都相同,即使最便宜和最昂贵的价格都相同,它仍然可以工作:)

CREATE TABLE article
    (`art` varchar(1), `price` int)
;

INSERT INTO article
    (`art`, `price`)
VALUES
    ('A', 1),
    ('B', 2),
    ('C', 1),
    ('D', 3),
    ('E', 4)
;

输出:

| art | price |
|-----|-------|
|   A |     1 |
|   C |     1 |
|   E |     4 |

答案 3 :(得分:0)

price上使用索引可能会具有非常好的性能:

select a.* 
from article a
where a.price = (select max(a2.price) from article a2) or
      a.price = (select min(a2.price) from article a2);

这将返回重复项。如果您只需要两行,而无需重复:

(select a.*
 from article a
 order by a.price asc
 limit 1
) union all
(select a.*
 from article a
 order by a.price desc
 limit 1
)