Невозможно определить правильный запрос SQL для записей хронологических таблиц - PullRequest
1 голос
/ 04 февраля 2011

Я часами пытаюсь найти правильный запрос SQL, чтобы выбрать последнюю историческую запись из таблицы (в MySQL).

В моем приложении я хотел бы хранить историю всех данныхмодификация.Таким образом, моя идея состояла в том, чтобы вместо ОБНОВЛЕНИЯ существующей записи я предпочел бы сделать ВСТАВКУ новой записи.Кроме того, есть счетчик ревизий, который увеличивается с каждой модификацией записи.

Это моя таблица:

uid  rid  created_by  deleted  revision  username  password  admin
 1    1      0           0        0      stefan    abcdefg     1
 2    2      1           0        0      maria     bcdefgh     1
 3    3      1           0        0      carl      cdefghi     0
 4    4      1           0        0      SUSANN    ABC123      0
 5    4      1           0        1      SUSANN    123ABC      0
 6    4      1           0        2      SUSANN    123ABC      1
 7    4      1           1        3      SUSANN    123ABC      1

Обратите внимание, что строки с номерами от 4 до 7 фактически являются одной и той же записью, а именно"Сьюзан".Ряд 4 - начальный ряд.В строке 5 изменен пароль, в строке 6 изменен флаг администратора, в строке 7 изменен флаг удаленного.

uid - это автоинкремент, который идентифицирует строку в таблице для внутренних целей., rid - это фактический идентификатор записи.

Сейчас.Выбор самой последней редакции отдельной записи может быть выполнен следующим образом:

ВЫБРАТЬ * ИЗ таблицы ГДЕ rid = 4 ЗАКАЗАТЬ ПО РЕДУКЦИИ DESC LIMIT 1

Моя проблема заключается в выборе списка всехпоследняя редакция всех входов в систему: на основе данных примера набор результатов должен быть следующим:

uid  rid  created_by  deleted  revision  username  password  admin
 1    1      0           0        0      stefan    abcdefg     1
 2    2      1           0        0      maria     bcdefgh     1
 3    3      1           0        0      carl      cdefghi     0
 7    4      1           1        3      SUSANN    123ABC      1

Может ли кто-нибудь указать мне правильное направление.Я думаю, что правильных ключевых слов уже будет достаточно.Оттуда я, вероятно, мог бы найти способ.

Спасибо.

1 Ответ

2 голосов
/ 04 февраля 2011

Это должно работать:

SELECT t.* 
FROM table t
JOIN (SELECT rid, MAX(revision) MaxRevision FROM table GROUP BY rid) mt
ON t.rid = mt.rid AND t.revision = mt.MaxRevision
...