Delete enregistrements > aux derniers

Rechercher

Delete enregistrements > aux derniers

Par arbilus  -  10 reponses  -  Le 20/07/2010 19:50  -  Editer  - 

Bonjours j'ai crée un graph avec des données sql via google chart . Celui affiche les 70 derniers enregistrements POUR UN ID (un membre) donné de ma table . Le problème est que j'aimerais faire un script qui me permettrait de mettre à jour automatiquement ma table en supprimant tous les enregistrements superieurs aux 70 derniers enregistrements pour CHAQUE ID (utilisateur) .

Et je ne vois pas comment m'y prendre .

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 21/07/2010 10:02  -  Haut de page  - 

Salut Arlibus,

tu devrais regarder dans la doc de MySQL, on y trouve des informations pratiques indispensables : par exemple dans la page détaillant la syntaxe de la commande DELETE.

On y voit en particulierqu'on peut ajouter une clause ORDER BY et une clause LIMIT. Dans ton cas, en admettant que tu aies bien entendu une clé primaire auto-incrémentée, la clause ORDER BY devra se faire sur la clé primaire. Supposons la table suivante :

+---------------------+
| matable_tab         |
+---------------------+
| tab_id         (PK) |
| aut_id         (FK) |
| tab_col_1           |
| tab_col_2           |
| ...                 |
| tab_col_n           |
+---------------------+

Nous avons là une table avec une clé primaire (tab_id) et une clé étrangère (aut_id). Nous voulons supprimer les donnéesau-delà de la 70ième pour chaque aut_id : ça va nous donner la requête suivante :

DELETE FROM matable
WHERE aut_id = nnn
ORDER BY tab_id DESC
LIMIT 71, 200;

Là, j'ai mis la limite supérieure arbitrairement à 200,tu peux mettre davantage si tu le souhaite, mais le point important, c'est que la suppression commencera à la 71ième ligne de données trouvées.

Note aussi que le tri (ORDER BY) se fait en ordre DESC, donc à partir de la plus grande valeur en descendant : donc on conservera les 70 lignes ayant la plus grande valeur de clé primaire, en d'autres termes, les dernières enregistrées.

Je te recommande vivement de créer une table de test et de faire des essais pour valider ton code :)

 
Par arbilus  -  Le 21/07/2010 13:25  -  Haut de page  - 

Pour te donner une idée de ce que je veux faire :

En faite c'est simplement un truc du style : je supprime tous les enregistrements supérieur au 70em dernier POUR CHAQUE ID en prenant en compte la date au format timestamp .

Voila ce que j'ai fait pour l'instant . Seulement ça ne fonctionne pas -> Warning: Invalid argument supplied for foreach() in /home/xxxxx/wwww.php on line 12 . (la ligne où il y a : "foreach($id_array as $key=>$value) { " ) .

 

 

require_once('../sqlconnect.php'); $query = 'SELECT id FROM xxxx'; $query_result = mysql_query($query); while($row = mysql_fetch_array($query_result)): $id_array[] = $row['id'];endwhile; foreach($id_array as $key=>$value) {$sql = "SELECT date_timestamp FROM xxxx WHERE id = '.$value.' ORDER BY date_timestamp DESC LIMIT 0,70";$quer = mysql_query($sql);while($roww = mysql_fetch_array($quer)){$date[] = $roww[date_timestamp];}mysql_query("DELETE FROM xxxx WHERE date_timestamp NOT IN (".implode(',', $date).")");}
 
Par arbilus  -  Le 21/07/2010 13:28  -  Haut de page  - 

Désolé, le code c'est mal affiché :

 

<?php require_once('../sqlconnect.php');  $query = 'SELECT id FROM xxxx'; $query_result = mysql_query($query);  while($row = mysql_fetch_array($query_result)):     $id_array[] = $row['id'];endwhile;  foreach($id_array as $key=>$value) {  $sql = "SELECT date_timestamp FROM xxxx WHERE id = '.$value.' ORDER BY date_timestamp DESC LIMIT 0,70";  $quer = mysql_query($sql);  while($roww = mysql_fetch_array($quer)){  $date[] = $roww[date_class];  }  mysql_query("DELETE FROM xxxx WHERE date_timestamp NOT IN (".implode(',', $date).")");}?>

 

 
Par arbilus  -  Le 21/07/2010 15:37  -  Haut de page  - 

Pff, j'ai trouvé mon erreur :

endwhile; -> il fallait le mettre à la fin

 
Par arbilus  -  Le 21/07/2010 15:37  -  Haut de page  - 

Par contre je sais pas si ça fonctionne, je vais voir .

 
Par arbilus  -  Le 21/07/2010 16:12  -  Haut de page  - 

Non, ça ne fonctionne pas. J'ai réglé le problème, mais un autre problème apparait : implode . Effectivement :

Warning: implode() [function.implode]: Invalid arguments passed in /home/xxxxx/public_html/xxxxx/xxxx.php on line 17

 

 
Par Cyrano  -  Le 21/07/2010 22:24  -  Haut de page  - 

Arlibus, je me demande si la lecture de ladoc fait partie de tes réflexes : tu as tous les éléments de réponses indispensable dedans : www.php.net à garder dans tes favoris.

Quand tu as une erreur du genre, c'est que les paramètres passés ne sont pas au bon format ou absents. Si on t'indique « invalid argument », ça veut dire « paramètre dont le format n'est pas valide», exemple, un tableau est attendu et tu as envoyé une valeur scalaire, ou l'inverse.

Sers-toi aussi de la fonction native var_dump pour afficher tes variables quand tu as un doute, c'est pratique pour te rendre compte qu'il y a un os dans le paté ;-)

 
Par arbilus  -  Le 22/07/2010 14:56  -  Haut de page  - 

 

Oui, j'avais bien compris que l'argument était invalide :) . Mais c'est bisard, je ne vois pas d'erreurs : j'ai bien mis un tableau pour l'implode : $date .

$date[] c'est $rows['date_timestamp']; -> rows c'est mysql_fetch_array($querys) . C'est donc bien un tableau .

$date devrait être "un tableau des valeurs de date_ timestamp .

Ensuite implode demande l'intervalle entre les valeurs puis un TABLEAU de valeurs . Je mets donc $date ... Et erreur :/ . Je pige vraiment pas où est l'erreur .

ps: quand j'utilise var_dump avec $date ça me met "NULL" -> ???? :/ ?? Je comprend pas, pourtant dans ma table il n'y a pas de quoi dire qu'elle est vide ...

 
Par Cyrano  -  Le 22/07/2010 15:01  -  Haut de page  - 

Précisément : tu découvres que la valeur reçue est NULL : le problème est donc peut-être en amont, tu ne crois pas ?

Vérifie ta requête SQL : fais la afficher à l'écran et teste là directement à la main dans MySQL : tu aura probablement davantage d'informations utiles pour trouver où est le problème.

 
Par arbilus  -  Le 22/07/2010 15:16  -  Haut de page  - 

C'est ce que je fais, je te tiens au courant dès que j'y arrive . De toute façon je suis sûr que c'est du soit à des problèmes d'ortho, soit de placements .. Soit les 2 :) .

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |