Выберите самую высокую и самую низкую статью в базе данных, как? - PullRequest
0 голосов
/ 30 марта 2019

Таблица с разными статьями.Задача состоит в том, чтобы выбрать товар с наивысшей ценой и товар с наименьшей ценой плюс номер артикула (первичный ключ)

Кажется, что это просто MAX / MIN, но на самом деле это не сработаетэто хорошо ..

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

Это только показывает мне номер статьи самой дешевой статьи.Как я могу это исправить?

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 30 марта 2019

в одну сторону:

SELECT ArtNr, MAX(Price), 'Most Expensive'
FROM article
GRoup By ArtNr
union all
SELECT ArtNr, MIN(Price), 'Cheapest'
FROM article
GRoup By ArtNr
0 голосов
/ 30 марта 2019

Это может иметь очень хорошую производительность с индексом на 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
) 
0 голосов
/ 30 марта 2019

Использовать 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 |
0 голосов
/ 30 марта 2019

В 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...