2013-12-13 2 views
1

Я ищу, чтобы получить 20 наивысших текущих продуктов.Mysql получить текущие по самой высокой цене изделия

У меня есть таблица продуктов, в которой есть таблица цен.

продукты: ID

цены: Идентификация, PRODUCT_ID, значение, CHANGE_DATE

Вот пример.

Product: 1 
    price: 11, change_date 12/1/2013, value: $10 
    price: 12, change_date 11/1/2013, value: $15 
Product: 2 
    price: 21, change_date: 12/1/2013, value: $12 
    price: 22, change_date: 11/1/2013, value: $10 
Product: 3 
    price: 31, change_date: 11/1/2013, value: $20 

Самые высокие "текущих" продуктов цене будет 3, чем 2, чем 1

Как бы я выполнить это в MySQL?

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

SELECT id, product_id, price, max(change_date) 
FROM prices 
GROUP BY product_id 
ORDER BY value DESC 
LIMIT 20 

Спасибо!

+3

К счастью, этот вопрос задают каждый день в SO – Strawberry

+0

@Strawberry, затем отметьте как DUP и реф, нет? –

+0

'groupwise-maximum'? Разве это не должно быть «наибольшее-n-на-группу»? –

ответ

2
SELECT id, product_id, value, change_date 
FROM prices 
JOIN (SELECT product_id, MAX(change_date) AS recent_date 
     FROM prices 
     GROUP BY product_id) AS most_recent 
    ON prices.product_id = most_recent.product_id 
    AND prices.change_date = most_recent.recent_date 
ORDER BY value DESC 
LIMIT 20; 
+0

решение работает отлично. – alaup

1

В параметре where where указывается max (change_dt) для каждого продукта.

select id, product_id, price, change_dt 
from price p 
where change_dt in (select max(change_dt) from price where product_id = p.product_id) 
order by price 
limit 20; 

Примечание: я сделал prices стол ее особая форма price.

SQL Скрипка:http://sqlfiddle.com/#!2/f6dc0/2

SQL-Fiddle только ограничивает цены на 1, так как я не хотел, чтобы 20+ цены на тестовые данные.

+0

лаконичное решение. Раньше я не использовал sqlfiddle, спасибо за подсказку – alaup

+0

. Стоит отметить, что этот пример более краткий, но, похоже, работает медленнее, чем другие решения. около 10 секунд по сравнению с 1 секундой на миллион строк цены. – alaup