2010-11-09 4 views
1

J'ai une table de journal des transactions qui est mise à jour chaque fois qu'un enregistrement est mis à jour.Mise à jour d'une table impliquant une clause groupby tout en évitant les tables temporaires

autoid ID Date  Source 
1  1 2010-10-11 abc 
2  2 2010-09-10 xyz 
3  1 2010-08-03 pqr 
4  1 2010-11-01 mno 

Je peux obtenir la plus récente mise à jour pour chaque ID par la requête suivante (il est efficace, est-il?):

select * from mytable group by ID order by Date desc; 

Maintenant, si j'ai une autre table qui devrait être mis à jour avec la date de transaction la plus récente, comment puis-je le faire sans créer de table temporaire?

La requête suivante est incorrecte, mais existe-t-il une alternative de requête imbriquée? Je ne veux pas créer de table temporaire.

update mytable a, othertable b 
set b.date = a.date 
where b.ID = a.ID group by ID order by Date desc; 

La solution d'ajreal a fonctionné!

update othertable, 
(select b.id, max(b.`date`) as latest from mytable b group by b.id) as b 
set othertable.`date` = b.latest 
where othertable.id=b.id 
; 
+0

ajouter dans l'index sur ID + date devrait aider, sans connaître la taille de la table et u semble SELECT * illimitee ... est une sorte de ne pas efficace, l'instruction UPDATE est erronée en raison manque d'alias de table dans GROUP BY – ajreal

+0

Cette table sur laquelle je travaille donne 700 lignes, d'où le nombre illimité. Donc un alias de table devrait faire un groupe par le travail dans la requête de mise à jour? Pourriez-vous s'il vous plaît dessiner un exemple de requête? Je reste généralement à l'écart des requêtes compliquées mais les tables temporaires sont quelque chose que je déteste! – ThinkCode

Répondre

1
update mytable, 
(select b.id, max(b.`date`) as latest from othertable b group by b.id) as b 
set mytable.`date`=b.latest 
where mytable.id=b.id 
; 
+0

J'ai essayé cela mais il y a une erreur. J'ai dû remplacer mytable par othertable puisque je suis en train de mettre à jour othertable avec les données de mytable. – ThinkCode

+0

create table mytable (autoid entier clé primaire auto_increment, id entier, date 'date', source varchar (3)); insertion dans mytable (id, 'date', source) VALUES (10, curdate() - 1, 'test'), (11, curdate() - 5, 'test'), (10, curdate() - 3, «test»); Créer une table othertable comme mytable; insertion dans othertable (id) VALUES (10), (11); – ThinkCode

+0

remarque quelques problèmes 1. curdate() - n peut être remplacé par date_add (curdate(), intervalle n jour) 2. longueur de caractère pour la source est trop petite – ajreal

Questions connexes