SELECT *
FROM price
WHERE name = 'product_name'
ORDER BY date DESC
LIMIT 1;
запрос сначала выбирает все записи с именем товара product_name
, затем сортирует их по дате в порядке убывания и возвращ. только одну посл. запись с помощью оператора LIMIT 1
.
Еще вариант:
SELECT * FROM price p1 WHERE date = (SELECT MAX(date) FROM price p2 WHERE p1.name=p2.name AND p1.name='product_name')
или так:
SELECT *
FROM (SELECT * FROM price WHERE name = 'product_name' ORDER BY date DESC) as temp_table
GROUP BY name
Еще одно решение может быть функции для вашей СУБД, например ROW_NUMBER()
в SQL, DENSE_RANK()
в Oracle или RANK()
в MySQL.
WITH temp_table AS (
SELECT id, link, name, cost, date, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) as rn
FROM price
)
SELECT * FROM temp_table WHERE name = 'product_name' and rn = 1;
Предложенный мной ранее запрос с использованием оператора GROUP BY
может возвращать неожиданный результат, если таблица price
содержит несколько записей с одинаковым именем товара и датой, так как в этом случае неопределенно, какую из этих записей вернет запрос. Есть несколько других способов решить эту задачу. Один из них - это использование сортировки и оператора LIMIT 1
в запросе. Например:
SELECT id, link, name, cost, date
FROM price
WHERE name = 'product_name'
ORDER BY date DESC
LIMIT 1;
Этот запрос выбирает все записи с именем товара 'product_name', сортирует их по дате в порядке убывания и возвращает только одну последнюю запись с помощью оператора LIMIT 1.
Другой способ - подзапрос с макс. датой:
SELECT id, link, name, cost, date