Выбор строк с наивысшей датой
У меня есть некоторые значения, которые повторяются в моей таблице, я хочу выбрать только те, у которых самая последняя/самая высокая дата i.e:
ID Type Name Value Date
-- ------- ----- ------- -------------
1 "FRUIT" "APPLE" "Imported" "2011-03-19 22:08:13"
5 "FRUIT" "LEMON" "Imported" "2011-03-19 22:00:44"
22 "FRUIT" "PEACH" "Imported" "2011-03-20 11:03:13"
31 "FRUIT" "MELON" "Imported" "2011-04-28 18:42:07"
44 "FRUIT" "PEACH" "Imported" "2011-04-12 11:06:11"
98 "FRUIT" "CHERRY" "Imported" "2011-03-19 22:46:04"
211 "FRUIT" "MELON" "Imported" "2011-03-19 22:25:24"
217 "VEG" "SPINACH""Imported" "2011-03-19 22:25:24"
Я хотел бы выбрать следующие:
ID Type Name Value Date
-- ------- ----- ------- -------------
1 "FRUIT" "APPLE" "Imported" "2011-03-19 22:08:13"
5 "FRUIT" "LEMON" "Imported" "2011-03-19 22:00:44"
31 "FRUIT" "MELON" "Imported" "2011-04-28 18:42:07"
44 "FRUIT" "PEACH" "Imported" "2011-04-12 11:06:11"
98 "FRUIT" "CHERRY" "Imported" "2011-03-19 22:46:04"
Это упрощенная версия того, что мне нужно, моя таблица имеет около 20 столбцов, поэтому я хочу выбрать *, если не могу выбрать один за другим.
Итак, я хочу выбрать * rows типа FRUIT, но выберите только те, у которых самая высокая дата. Спасибо вам
Ответы
Ответ 1
Это должно дать вам то, что вы хотите:
SELECT *
FROM Table
INNER JOIN
(SELECT Name, MAX(Date) as TopDate
FROM Table
WHERE Type = 'FRUIT'
GROUP BY Name) AS EachItem ON
EachItem.TopDate = Table.Date
AND EachItem.Name = Table.Name
В принципе, он найдет самую последнюю дату для каждого типа фруктов, а затем отобразит каждый фрукт с информацией для строки (соединенной с датой и именем фрукта). Убедитесь, что поле Date field и Name индексированы.
Если вы можете предположить, что элемент с наивысшим идентификатором также будет иметь наивысшую дату (типичный, но не обязательно истинный во всех случаях - это зависит от вашего варианта использования), вы можете сделать MAX(ID)
вместо MAX(Date)
и воспользуемся просто связыванием этого идентификатора вместо привязки по дате и имени.
Ответ 2
Если вы используете mysql, он будет заказывать SELECT весь тип "fruit" и заказывает дату от старейшего до новейшего:
SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC
В случае необходимости вы могли бы ограничить его (это ограничило бы самое старое 5):
SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC LIMIT 5