Моя кишка говорит мне, что, вероятно, не быстрее способ сделать это, чем сделать для цикла в приложении через все страницы, делая немного select item_price from item where page_id = ? order by item_price desc limit 3
для каждого paqe, и, возможно, торчащие результаты в что-то вроде memcached, поэтому вы не слишком сильно обходите свою базу данных.
Но мне нравится вызов, поэтому я все равно попытаюсь.
SELECT p1.*, i1.*,
(SELECT count(*)
FROM items i2
WHERE i1.item_price < i2.item_price
AND p1.page_id = i2.page_id) price_rank,
FROM pages p1
LEFT OUTER JOIN items i1
ON p1.page_id = i1.page_id
WHERE price_rank < 3;
Этот странный суб-выбор будет, вероятно, сделать очень много работы для каждой строки в items
. многие другие функции RDBMses имеют функцию, называемую оконными функциями, которые могут сделать это намного элегантнее. Например, если вы используете PostgreSQL, вы могли бы написать:
SELECT p1.*, i1.*,
RANK(i1.item_price)
OVER (PARTITION BY p1.page_id
ORDER BY i1.item_price DESC) price_rank
FROM pages p1
LEFT OUTER JOIN items i1
ON p1.page_id = i1.page_id
WHERE price_rank <= 3;
И планировщик устроил бы посетить строки в порядке, что приводит к рангу происходящим правильно.
Вы хотите получить 3 верхних позиций для всех страниц одновременно или по одной странице за раз? –
Я хочу вывести список всех страниц, отображающих три верхние позиции каждой страницы (верхняя - самая высокая цена, а страницы упорядочены по кумулятивной максимальной цене). Благодаря! – PotatoFro
Заданный вопрос, откуда вы узнали, на какую страницу он принадлежит? –