Requete pour garder un nombre précis de champs en supprimant les indésirables

WRInaute accro
Bonjour,

je dois grouper des flux et j'ai besoin de purger la table de flux regulieremen, je n'ai encore rien codé, je souhaiterai avoir la requete avant de commencer le coding

le probleme: j'ai une table a 4 champs (id,nom,categorie,date) ou il faut supprimer des champs dans chaque categorie pour ne garder que les 10 derniers champs rentrés par categorie.
j'ai pensé a une requete de ce genre, est ce ok ??

DELETE FROM tb WHERE (SELECT * FROM tb GROUP BY cat LIMIT 100,11)
 
WRInaute accro
A bon moi elle me semble un peu bidon la requête, t'es sur qu'elle s'exécute ?
Moi je ferais un pti script en tache cron qui fait ceci:

Un petit select des catégories
Pour chaque catégorie on execute ceci:
DELETE FROM tb where categorie = $CURRENTCATEGORIE order by id desc limit 10,18446744073709551615
 
WRInaute accro
j'ai envie de m'épargner les phases tests, parceque j'ai beaucoup de mal a coder en ce moment(mes ordi son dans un conteneur car je déménage) et j'ai besoin de temps.
la requete je preferai la baser sur les dates et surtout pas sur les id car la table va vite devenir un gruyere a ajouter et supprimer sans arret. Donc tu me conseil de faire une boucle sur les categorie et de supprimer a chaque passage, ca me semble bien vu que je n'ai que 5-6 categories

DELETE FROM tb
WHERE categorie = $CURRENTCATEGORIE
ORDER BY date DESC
LIMIT 10,100;

voila, je reste sur cette requete basique avec une boucle, la meme sans boucle je suis preneur :)
 
WRInaute accro
Vu que les id ne font que augmenter (autoincrement) tu peux te baser dessus non ?
En une seule requête je crois pas que ce soit possible. Sinon les procédures stockées et compagnie ont été inventées pour rien :p
 
WRInaute accro
YoyoS a dit:
Vu que les id ne font que augmenter (autoincrement) tu peux te baser dessus non ?

oui tu as raison avec 1 autoincrement c'est faisable., mais au final je vais zaper l'id vu qu'il faut les 10 derniers enregistrements par date et les flux eux meme ne seront pas indexé, seul les pages categories vont l'etre

pour la limite j'aurais plutot commencé a supprimer a partir de 11 vu quil faut garder les 10 premiers ?
 
WRInaute accro
la requête de base (celle que tu as marquée au début) ne pourra pas s'exécuter car tu n'as as indiqué de champ.
il faudrait, au moins un :
DELETE FROM tb WHERE id in (SELECT id FROM tb "là tu mets ton filtrage")
 
WRInaute accro
o j'avais pas vu ton post Leonick, j'aurais net préférer avoir 1 seule requete

je viens de le faire et c'est loin de passer en 1 requete, 2 petite au depart puis autant de requetes que d'id a supprimer/// le script est deja en tache cron donc j'y reviendrais pas dessus, j'en profite pour signaler un flux nouveau de news php et c'est pour cleaner ce flux que j'avais besoin de la dite requete (--http://www.phpsources.org/actualites-php.htm)

le code pour cleaner

Code:
<?php
  $nbre_element = 11;

  $q = mysql_query('SELECT cat FROM `actualite_datas_flux` GROUP BY cat');
       while ($r1 = mysql_fetch_array($q)) {
              $cat_actualites[] = $r1;
       }

  $q = mysql_query('SELECT id, cat FROM `actualite_datas_flux` ORDER BY date DESC');
       while ($r2 = mysql_fetch_array($q)) {
              $datas_actualites[] = $r2;
       }

  foreach($cat_actualites as $cat_actualites_r) {
    $compteur = 0;
    foreach($datas_actualites as $datas_actualites_r) {
    if ($cat_actualites_r['cat'] == $datas_actualites_r['cat']  ) {
    $compteur++;
    if ( $compteur >= $nbre_element )
         mysql_query('DELETE
                      FROM `actualite_datas_flux`
                      WHERE id = '.$datas_actualites_r['id'].'');
    }
   }
  }
  ?>
 
WRInaute accro
C'était faisable en seulement 2 requêtes. Tu sélectionnes les catégories puis tu supprimes tout ce qui ne correspond pas aux 10 plus récentes dans chaque catégorie !
 
WRInaute accro
ouai on avait parler de faire 1 table et de boucler dessus, moi j'en ai fait 2, de toute facon ca faisant autant de requete que de categories existantes a verifier donc beaucoup plus que 2 requetes en tout cas. J'ai fais 2 tables car j'en ai profiter pour faire d'autres opérations, j'ai simplement mis le code brut. Merci pour ton aide ++
 
Discussions similaires
Haut