Выбор строк с самой высокой датой - PullRequest
18 голосов
/ 16 мая 2011

У меня есть некоторые значения, которые повторяются в моей таблице, я хочу выбрать только те, которые имеют самую последнюю / самую высокую дату, т.е.:

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 столбцов, поэтому я хочу выбрать *, если нет, я могу выбрать один за другим.

Итак, я хочу выбрать * строки типа FRUIT, но выбрать только те, которые имеют самую высокую дату. Спасибо

Ответы [ 2 ]

30 голосов
/ 16 мая 2011

Это должно дать вам то, что вы хотите:

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 и Name оба проиндексированы.

Если вы предполагаете, что элемент с наивысшим идентификатором также будет иметь элемент с наивысшей датой (типично, но не обязательно верно во всех случаях - это зависитв вашем случае использования), вы могли бы сделать MAX(ID) вместо MAX(Date) и воспользоваться преимуществом простой ссылки по этому идентификатору вместо ссылки по дате и имени.

7 голосов
/ 16 мая 2011

Если вы используете 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...