Как получить самую последнюю запись с меткой времени для того же идентификатора из таблицы MySQL?

Возможный дубликат:
Извлечь строку, которая имеет значение Max для столбца

У меня есть таблица аудита людей и количества акций, которыми они владеют в определенный момент времени. Как мне получить самую последнюю запись для данного идентификатора?

MySQL таблица аудита

id name shares  dateadded 
1  Abc  12      2012-10-06 12:18:21
2  Klm  23      2012-10-06 12:18:21
3  Jim  45      2012-10-06 12:18:21
1  Abc  35      2012-11-06 12:18:21
1  Abc  65      2012-11-17 12:18:21
2  Klm  13      2012-11-06 12:18:21

Мой желаемый результат:

id name shares  dateadded 
1  Abc  65      2012-11-17 12:18:21
2  Klm  13      2012-11-06 12:18:21
3  Jim  45      2012-10-06 12:18:21

Я мог бы сделать что-то вроде этого:

select a.* from audittable a join audittable b 
on a.id = b.id
where a.dateadded > b.dateadded;

Но это дает мне только те самые последние записи, которые повторяются. В этом случае идентификаторы 1,2, а не 3. Как получить список самых последних записей для всех идентификаторов без подзапросов или временных таблиц?

2 ответа

Решение

Вам понадобится подзапрос, но не подвыборы (которые очень негативно влияют на производительность).

JOIN против подзапроса, который возвращает id а также MAX(dateadded) агрегат. Соединение подзапроса необходимо, чтобы иметь возможность сопоставлять все другие значения столбца в строке, содержащей последнюю метку времени.

SELECT
  audittable.id,
  name,
  shares,
  audittable.dateadded
FROM
  audittable
  /* Subquery returns id dateadded grouped by id */
  JOIN (
    SELECT id, MAX(dateadded) AS dateadded FROM audittable GROUP BY id
    /* JOIN condition is on both id and dateadded between the two tables */
  ) maxtimestamp ON audittable.id = maxtimestamp.id AND audittable.dateadded = maxtimestamp.dateadded

Вот демонстрация на SQLfiddle

Без подзапросов вы ограничены этим

SELECT id, MAX(dateAdded)
FROM audittable
GROUP BY id

Если вы хотите, чтобы другие столбцы, вам нужен подзапрос, как ответ Михаила Берковски

Другие вопросы по тегам