Альтернатива использованию max () в секции where? - PullRequest
0 голосов
/ 14 сентября 2018

Я довольно плохо знаком с SQL и пытаюсь отобразить только одну категорию, в которой самая дорогая книга.Моей первой идеей было удалить max(books.purchase_price) из select и добавить max(books.purchase_price) = books.purchase_price в раздел where.Но это дает мне сообщение об ошибке.

select categories.category, max(books.purchase_price) as price
from books, categories
where categories.category_id = books.category_id
group by categories.category
order by pris desc
limit 1

Существует только две таблицы: books, в которых есть записи с заголовками, ценами и category_idcategories, которые имеют category_id и различные категории (имена).

1 Ответ

0 голосов
/ 14 сентября 2018

Если вам нужна только одна максимальная запись, используйте этот запрос:

SELECT c.category
FROM books b
INNER JOIN categories c
    ON c.category_id = b.category_id
ORDER BY b.purchase_price DESC
LIMIT 1;

Это упорядочивает набор результатов по цене покупки в порядке убывания (т. Е. Сначала самый дорогой), затем ограничивается однимзапись.Обратите внимание, что я использовал явное внутреннее объединение вместо неявного соединения старой школы, которое вы использовали выше.

Если бы можно было связать несколько книг по максимальной цене, нам пришлось бы прибегнуть к использованию RANKфункция:

SELECT DISTINCT category
FROM
(
    SELECT c.category,
        RANK() OVER (ORDER BY b.purchase_price DESC) rank
    FROM books b
    INNER JOIN categories c
        ON c.category_id = b.category_id
) t
WHERE t.rank = 1;
...