具有不同文章的表。任务是选择价格最高的商品和价格最低的商品加上商品编号(主键)
这似乎很简单MAX
/ MIN
,但效果并不理想。
SELECT ArtNr, MAX(Price) AS Most_expensive, MIN(Price) AS CHEAPEST FROM article;
仅显示最便宜商品的商品编号。 我怎样才能解决这个问题?
非常感谢!
答案 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
)