2011-02-04 6 views
1

J'essaie depuis des heures de trouver la requête SQL correcte pour sélectionner le dernier enregistrement historcal d'une table (en MySQL).Impossible de trouver la bonne requête SQL pour les enregistrements de tables historiques

Dans mon application, je voudrais garder un historique de chaque modification de données. Donc, mon idée était, au lieu de faire une mise à jour à un enregistrement existant, je préfère faire un INSERT d'un nouvel enregistrement. De plus, il y a un compteur de révisions, qui augmente avec chaque modification d'enregistrement.

C'est ma table:

 
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 

Notez les lignes avec uid 4 à 7 sont en fait le même dossier, à savoir de "SUSANN". La rangée 4 est la rangée initiale. La ligne 5 a modifié le mot de passe, la ligne 6 modifie le drapeau d'administration, la ligne 7 a modifié le drapeau supprimé.

uid est un incrémenteur automatique et identifie la ligne dans la table à des fins internes. rid est l'ID d'enregistrement réel.

Maintenant. Sélection de la version la plus récente d'un seul enregistrement peut se faire de cette façon:

SELECT * FROM table OU rid = 4 ORDER BY révision DESC LIMITE 1

Mon problème est de sélectionner une liste de toutes les dernières révision de toutes les connexions: sur la base de données de l'échantillon de l'ensemble de résultat devrait être:

 
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 

quelqu'un pourrait-il me diriger dans la bonne direction. Je pense que les bons mots-clés suffiraient déjà. De là, je pourrais probablement trouver un moyen.

Merci.

Répondre

2

Cela devrait fonctionner:

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 
+0

Ca y est ... en plus d'une petite faute de frappe, il fait exactement ce que je voulais. Merci Lamak. –

Questions connexes