Page 1 sur 1

PHP+SQL : Conserver uniquement le dernier enregistrement et virer les autres...

Posté : 18 mai 2015, 11:22
par LeVoL
Bonjour à tous,

je suppose qu'on la pose souvent celle-ci mais (je la pose quand meme :lol: )

j'ai une table avec un id auto_increment, et un champs nom...

je souhaite conserver le dernier ID de ce nom :
exemple de mon cerveau : SELECT MAX(id) AS max_id FROM ma_table WHERE nom = 'mon_nom' (vous me dites si je me trompe hein ^^

par contre comment lui indiquer de supprimer tout sauf celui-ci (de manière optimisé) ?
exemple de ce qui reste du cervelet : DELETE FROM ma_table WHERE id != max_id && nom = 'mon_nom' ?

Et je suis une quiche en jointure (meme en ayant lu x fois les tutos ca rentre pas... :/) alors si vous avez ca en une ligne

Merci :)

Re: PHP+SQL : Conserver uniquement le dernier enregistrement et virer les autres...

Posté : 18 mai 2015, 12:09
par yann18
bonjour,
DELETE FROM ma_table WHERE id NOT IN ( SELECT * FROM ( SELECT  MAX(id)  FROM ma_table ) AS sous_requete );
Max(id) correspond certes au plus grand id mais ne correspond pas toujours au dernier id inséré.la fonction LAST_INSERT_ID() est à privilégier en lieu et place de MAX(ID) pour récupérer le dernier id insérer.

Re: PHP+SQL : Conserver uniquement le dernier enregistrement et virer les autres...

Posté : 19 mai 2015, 11:20
par LeVoL
Merci yann18 par contre tu n'as pas pris en considération le nom... en fait chaque nom envoit plusieurs fois des données et je souhaite conserver que le dernier enregistrement...

ta formule actuelle supprime tous les enregistrements des autres clients egalement ^^

sauf erreur de ma part :

DELETE FROM ma_table WHERE nom='nom' AND id NOT IN ( SELECT * FROM ( SELECT MAX(id) FROM ma_table WHERE nom='nom') AS sous_requete );

et Bonne journée à tous !

Re: PHP+SQL : Conserver uniquement le dernier enregistrement et virer les autres...

Posté : 19 mai 2015, 22:37
par yann18
la requête suivante récupère le dernier nom

Code : Tout sélectionner

SELECT * FROM ( SELECT MAX(id) FROM ma_table WHERE nom='nom')
Maintenant pour supprimer tous les enregistrements sauf le dernier il suffit de spécifier l'opérateur NOT IN:
DELETE FROM ma_table WHERE id NOT IN ( SELECT * FROM ( SELECT  MAX(id)  FROM ma_table  WHERE nom='nom' ) AS sous_requete );