Подтвердить что ты не робот

Выбор строк с наивысшей датой

У меня есть некоторые значения, которые повторяются в моей таблице, я хочу выбрать только те, у которых самая последняя/самая высокая дата 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, но выберите только те, у которых самая высокая дата. Спасибо вам

4b9b3361

Ответ 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