Delete enregistrements > aux x derniers .

arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015 - 20 juil. 2010 à 19:45
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015 - 22 juil. 2010 à 10:34
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 .

14 réponses

darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
20 juil. 2010 à 21:32
un DELETE avec un LIMIT de $last_id, 70

darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015
20 juil. 2010 à 21:47
Cela voudrait dire qu'on supprime tout les enregistrements suivant $last_id et jusqu'au 70em ?
Mais je ne comprend pas $last_id . Pourrais-tu être plus précis concernant ceci ?
0
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015
20 juil. 2010 à 21:57
J'ai essayé un truc du style DELETE FROM table WHERE id NOT IN (SELECT id FROM table ORDER BY xxxx_date DESC LIMIT 0, 70)

Mais ça ne fonctionne pas .
0
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
20 juil. 2010 à 23:06
Dans l'idéal, il faudra récupérer l'id du dernier enregistrement et exécuter la requête suivante (en espérant que les id se suivent):

si offset = 70

DELETE FROM graph WHERE (id < ($last_id + 1) AND id > ($last_id - $offset - 1));

darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0

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

Posez votre question
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
20 juil. 2010 à 23:10
exemple valable pour cette table

CREATE TABLE `test`.`graph` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`point_x` tinyint(4) NOT NULL,
`point_y` tinyint(4) NOT NULL,
PRIMARY KEY (`id`)
)

donc à adapter suivant la situation

darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015
20 juil. 2010 à 23:30
Oui, sauf que ce que je prend en compte pour connaitre les enregistrements qui ne font pas parti des 70 derniers, c'est la date de type timestamp .

Donc pour te donner une id (heu idée .. la blague du soir) . Voila ce que j'ai réussi à faire :

<?
include "sqlconnect.php";
function imp($char,$tag){
foreach($char as $key=>$value){
$char[$key] = $value;
}
$char = implode($tag,$char);
return $char;
}
$sql = "SELECT date_timestamp FROM xxxx ORDER BY date_timestamp DESC LIMIT 0,70";
$query = mysql_query($sql);
while($row = mysql_fetch_array($query)){
$date[] = $row[date_timestamp];
}
mysql_query("DELETE FROM xxxx WHERE date_timestamp NOT IN (".implode(',', $date).")");
?> 


Ce serait un truc de ce genre . Le seul problème avec ce code c'est qu'il ne fait pas ça POUR CHAQUE ID (style: pour id 1 il fait ça , ensuite pour id 34 aussi etc ..)

Du style: je supprime tous les enregistrements supérieur au 70em dernier POUR CHAQUE ID en prenant en compte la date .
0
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
20 juil. 2010 à 23:40
<?php
require_once('sqlconnect.php');

$query = 'SELECT id FROM xxxx ORDER BY date_timestamp DESC LIMIT 0,70';
$query_result = mysql_query($query);

//Récupération des id des 70 derniers enregistrements
while($row = mysql_fetch_array($query)):
$id_array[] = $row['id'];
endwhile;


foreach($id_array as $key=>$value):
mysql_query('DELETE FROM xxxx WHERE id = '.$value.' LIMIT 1');
endforeach;


?> 



darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
20 juil. 2010 à 23:42
<?php
require_once('sqlconnect.php');

$query = 'SELECT id FROM xxxx ORDER BY date_timestamp DESC LIMIT 0,70';
$query_result = mysql_query($query);

//Récupération des id des 70 derniers enregistrements
while($row = mysql_fetch_array($query_result)):
$id_array[] = $row['id'];
endwhile;

//Suppression pour chaque id récupéré auparavant
foreach($id_array as $key=>$value):
mysql_query('DELETE FROM xxxx WHERE id = '.$value.' LIMIT 1');
endforeach;


?>


darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
20 juil. 2010 à 23:49
<?php 
require_once('sqlconnect.php'); 

$query = 'SELECT id FROM xxxx ORDER BY date_timestamp DESC LIMIT 0,70'; 
$query_result = mysql_query($query); 

//Récupération des id des 70 derniers enregistrements 
while($row = mysql_fetch_array($query_result)): 
    $id_array[] = $row['id']; 
endwhile; 

//Suppression pour chaque id récupéré auparavant 
foreach($id_array as $key=>$value): 
    mysql_query('DELETE FROM xxxx WHERE id = '.$value.' LIMIT 1'); 
endforeach; 


?>



darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015
21 juil. 2010 à 13:18
ça ne fonctionne pas . cela selection les 70 dernieres id(s) de la table en les classant par date_timestamp puis ça supprime tous les 70 derniers enregistrements où l'id appartient à un des id sélectionné en amont .

Moi j'aurais vu plutôt un truc de ce genre :

<?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_timestamp];
}
mysql_query("DELETE FROM xxxx WHERE date_timestamp NOT IN (".implode(',', $date).")");
}
?>


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) { " ) .
0
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015
21 juil. 2010 à 21:26
Personne ne peut m'aider ?
0
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
21 juil. 2010 à 23:19
Il faut faire un
'ORDER BY date_timestamp ASC LIMIT 0,70'
! Pour récupérer les id des 70 derniers enregistrements (car enregistrer par le temps)

Et après faire pour chaque id récupéré
'DELETE FROM xxxx WHERE id = '.$value


Perso çà marche chez moi ... Donc soit le problème est mal exposé, soit les modifs que t'as fait à partir de mes indications sont erronées...

darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
darkelda Messages postés 49 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 16 mai 2012
21 juil. 2010 à 23:22
Pour la première requête c'est

SELECT * FROM xxxx ORDER BY date_timestamp DESC LIMIT 0, 70


DAILLEURS QUAND VAS TU TRANSMETTRE LA STRUCTURE DE TA BASE AVEC UN EXEMPLE D'INSERT!!!


darkelda
Développeur PHP&MySQL / Webmaster Freelance
Suivez Moi
0
arbilus Messages postés 93 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 20 avril 2015
22 juil. 2010 à 10:34
Non, je suis désolé mais ton code ne fonctionne pas comme il faut . Il supprime tous les enregistrements jusqu'au 70 em dernier alors qu'il faudrait qu'il supprime tous les enregistrements superieur au 70em dernier de chaque id .
0
Rejoignez-nous