Supression automatique MySQL

Utilisateur anonyme - 25 avril 2005 à 21:39
Freezystem Messages postés 5 Date d'inscription dimanche 24 mai 2009 Statut Membre Dernière intervention 5 septembre 2009 - 5 sept. 2009 à 11:39
Bonsoir, j'aurais aimer savoir si il est possible de supprimer automatiquement une ligne MySQL

Je m'explique :



En fait il faudrais pouvoir compter le nombre de ligne dans la table
MySQL (mysql_num_rows) ensuite si le nombre de ligne est superieur à
par exemple 50 on va dire 51 ça supprime la 51eme ligne trier par ID
DESC pour effacer par exemple la ligne avec l'ID la plus petite (1 par
exemple).



Si quelqu'un aurait une idée !

Merci

Simon

21 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 avril 2005 à 09:28
Hello,



la 51eme, ou, si tu en as plus, toutes les lignes au-dessus de 50 ?



Enfin oui c'est possible. num_rows en effet pour compter, puis un drop avec la clause LIMIT.



Par exemple :



DELETE FROM matable LIMIT 50, 1

effacera la ligne 51.





DELETE FROM matable LIMIT 50



effacera toutes les lignes a partir de la 51eme. (l'offset commence a 0, pas a 1, comme pour un tableau).
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
26 avril 2005 à 15:51
Salut,



mysql_connect('hote','user','passe');

$r=mysql_fetch_row(mysql_query('SELECT COUNT(*) FROM ta_table'));

$nbre=$r[0]-50; //nombre de lignes à supprimer

mysql_query('DELETE FROM ta_table WHERE id<'.$nbre);

mysql_close();



ça devrait fonctionner.



a +

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
Utilisateur anonyme
26 avril 2005 à 23:25
En fait je me suis mal exprimer et je me suis tromper dans la question,
je voudrais plutot supprimer l'id 1 par exemple quand on arrive à 50
lignes, ensuite l'id deux quand on arrive de nouveau à 50 lignes etc
... pour qu'il y est toujours 50 lignes au total, et qu'il supprimer
les plus anciennes !
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
26 avril 2005 à 23:35
J'ai parfaitement compris ;-)



Tu as essayé ma solution ?

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
26 avril 2005 à 23:36
Le problème est que tes ID ne reviennent pas à zéro ensuite...



Attends, rajoute-ça à mon code :




mysql_connect('hote','user','passe');

$r=mysql_fetch_row(mysql_query('SELECT COUNT(*) FROM ta_table'));

$nbre=$r[0]-50; //nombre de lignes à supprimer

mysql_query('DELETE FROM ta_table WHERE id<='.$nbre);

mysql_quer('UPDATE ta_table SET id=id-'.$nbre);

mysql_close();

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 avril 2005 à 08:17
La je ne pige pas lol...

Ok j'avais mal compris (omis le DESC), mais...ma solution reste valable, avec le limit. Il suffit de changer les bornes, voila tout, et c'est plus simple.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
27 avril 2005 à 09:19
Ta solution ne sera pas valable si la table n'est pas organisée par id DESC.



Donc il faut s'assurer que la table est bien organisée par ID DESC (ce
qui n'est plus forcément le cas après de multiples ajouts/suppressions.



Bref il te faut une requête supplémentaire : ALTER ta_table ORDER BY id DESC



donc en tout deux requêtes. Un order étant quelque chose de gourmand,
je pense que ma solution est plus rapide sur une table qui commence à
avoir du contenu (si t'as le courage de tester ^^)



a +
<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 avril 2005 à 09:40
Ben...

DELETE FROM matable ORDER BY id DESC LIMIT 1

non ?
(je n'ai pas rajoute le calcul en fonction de la limite a 50 hein, mais le principe est le meme).
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
27 avril 2005 à 11:08
Justement je sais pas si ça marche, en tout cas si ça marche c'est clair qu'il faut prendre cette solution :-)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
27 avril 2005 à 11:08
DELETE FROM matable ORDER BY id DESC LIMIT 50



plutôt, vu qu'on supprime les ID les plus anciens à partir du 50 ième :-)


<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 avril 2005 à 11:15
Certes lol, decidement, j'ai du mal avec le sens ;-)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 avril 2005 à 11:16
Et cela devrait marcher je pense, vu cet exemple sur la doc (un peu different je te l'accorde) :



DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
27 avril 2005 à 12:01
Ouais tout à fait :-)



Le tout fait en une seule requête, par contre je pense que sur une
table ayant beaucoup d'enregistrements ma solution sera plus
performante, mais vu qu'on ne garde que 50 enregistrements, ta solution
est parfaite :-)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
Utilisateur anonyme
27 avril 2005 à 12:13
A quoi correspond timestamp
?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 avril 2005 à 12:18
A rien, c'est juste un exemple la. timsteamp ici est le nom d'un champ de la base utilisee en exemple, c'est tout. Et tu n'as pas besoin de clause WHERE, toi.
0
Utilisateur anonyme
27 avril 2005 à 12:21
je vois pas trop la ... pourrais-tu m'eclairer un peu plus ?
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
27 avril 2005 à 12:23
Malalam t'a donné la requête plus haut... Cherche un peu on va pas tout te fournir sur un plateau d'argent non plus...

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 avril 2005 à 12:29
Ou plus exactement Antho, vu que j'ai omis l'ordre de tri.
0
Utilisateur anonyme
27 avril 2005 à 23:05
J'ai fait ça :



<?

require("../admin/config.php");

$compte = mysql_query("SELECT * FROM chat ORDER BY ID DESC");

$verif_avatar = mysql_num_rows ($compte);

if ($verif_avatar > 50) {

$delete = "DELETE FROM chat ORDER BY id LIMIT 1";

$resultat=mysql_query ($delete);

}

$sql = mysql_query("SELECT * FROM chat ORDER BY ID DESC");

while ($Ligne = mysql_fetch_array ($sql))

{

echo $Ligne['pseudo'];

echo "
";

}

?>



ça marche ça me laisse 50 lignes et ça supprimer les plus anciennes lorsque ça dépasse 50.
0
Freezystem Messages postés 5 Date d'inscription dimanche 24 mai 2009 Statut Membre Dernière intervention 5 septembre 2009
4 sept. 2009 à 22:44
Je cherche aussi une requête efficace.

Moi j'aurais fait :

DELETE FROM chat WHERE id NOT IN (SELECT id FROM chat ORDER BY id DESC LIMIT 20);

En français ça donnerais :
Supprimer tout les messages de la table chat dont les "id" ne sont pas dans les 20 derniers "id" de la table chat.

Mais bon.. apparemment pas compatible avec les serveur PhpMyAdmin..
0
Rejoignez-nous