Mysql: Effacer tout ce qui est au-dessus d'une limite

seabird
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 308
Inscription: 1 Déc 2003

Mysql: Effacer tout ce qui est au-dessus d'une limite

Message le Jeu Aoû 07, 2008 9:24

Bonjour,

Je cherche par exemple a effacer tout ce qui est au-dessus de 20 enregistrements triés par ordre décroissant, sachant que les id ne se suivent pas obligatoirement. Donc je ne peux pas faire:
Code: Tout sélectionner
$query ="DELETE FROM $table WHERE id>20 ORDER BY nombre DESC";
$result = mysql_query($query);



J'ai pensé faire 2 requètes:
Une pour connaitre le nombre de ligne et une pour effacer.

Code: Tout sélectionner
$query1="select * from $table ORDER BY nombre DESC";      
$result1 = mysql_query($query1);
$nombre_lignes=mysql_num_rows($result1);
   
$query2 ="DELETE FROM $table ORDER BY nombre DESC LIMIT 20,$nombre_ligne";
$result2 = mysql_query($query2);       


Mais il semble apparemment que Delete ne supporte pas un Limit à 2 arguments.

J'ai essayé tout simplement d'écrire pour voir:
Code: Tout sélectionner
$query ="DELETE FROM $table  LIMIT 2";
$result = mysql_query($query);

qui fonctionne correctement

par contre :
Code: Tout sélectionner
$query ="DELETE FROM $table  LIMIT 1,2";
$result = mysql_query($query);

ne fonctionne pas.

Si vous avez une idée je suis preneur :)


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Re: Mysql: Effacer tout ce qui est au-dessus d'une limite

Message le Jeu Aoû 07, 2008 9:29

seabird a écrit:Si vous avez une idée je suis preneur :)


Comme ça :
DELETE FROM $table WHERE id not in (SELECT id FROM $table ORDER BY nombre LIMIT 0,20)

seabird
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 308
Inscription: 1 Déc 2003

Message le Jeu Aoû 07, 2008 9:44

Ok merci , je n'ai pas pensé à imbriquer.
Mais cela ne marche pas. Je n'ai pas d'erreur, mais rien n'est effacé :( et à priori je ne vois pas pourquoi ..


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Jeu Aoû 07, 2008 9:49

Si c'est seulement 20lignes que tu veux sauvegarder, exporte ta table avec ses données puis efface tout. Ensuite une simple requête insert avec les 20lignes ;)

Et puis si tu fais order by nombre DESC, il y a surement moyen de faire

DELETE FROM $table WHERE nombre < x ?

seabird
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 308
Inscription: 1 Déc 2003

Message le Jeu Aoû 07, 2008 10:00

YoyoS a écrit:Si c'est seulement 20lignes que tu veux sauvegarder, exporte ta table avec ses données puis efface tout. Ensuite une simple requête insert avec les 20lignes ;)

Et puis si tu fais order by nombre DESC,


A oui tiens pourquoi pas, c'est un peu laborieux mais c'est une bonne idée.

En fait pour éclaircir un peu les choses.
Je veux déterminer les mots cles les plus tapés tout en ne conservant que les 20 mots cles les plus importants. Donc si je n'efface pas apres les 20 premiers , ma base n'arrêtera pas de grossir.
Dernière édition par seabird le Jeu Aoû 07, 2008 10:04, édité 1 fois.


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Message le Jeu Aoû 07, 2008 10:04

C'est vrai que le limit ne fonctionne que moyennement en sous-requete (et encore, ça dépend des versions de mysql).
Autre solution, une table temporaire :

Code: Tout sélectionner
CREATE TEMPORARY TABLE tmptable
SELECT id FROM $table
order by nombre
limit 0,20;

DELETE $table FROM $table
INNER JOIN tmptable
ON $table.id = tmptable.id;

seabird
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 308
Inscription: 1 Déc 2003

Message le Jeu Aoû 07, 2008 10:56

Bon ce que j'ai fait pour finir:
Je veux etre sur par exemple de garder 2000 enregistrements.
Code: Tout sélectionner
select * from $table ORDER BY nombre DESC LIMIT 0,2000


J'efface la table:
Code: Tout sélectionner
TRUNCATE TABLE $table


et je réécris:
Code: Tout sélectionner
INSERT INTO $table (mots_cles,nombre) VALUES ('$mots_cles','$nombre')


et après je ne sélectionne que les 20 plus importants.
Code: Tout sélectionner
select * from $table ORDER BY nombre DESC LIMIT 0,20


Ca me parait un peu lourd , mais bon ça marche.


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Re: Mysql: Effacer tout ce qui est au-dessus d'une limite

Message le Jeu Aoû 07, 2008 13:40

arnaudmn a écrit:
seabird a écrit:Si vous avez une idée je suis preneur :)


Comme ça :
DELETE FROM $table WHERE id not in (SELECT id FROM $table ORDER BY nombre LIMIT 0,20)


nan c pas possible d'utiliser limit dans une sous requete mais par contre cela peux se contourner ansi :-)

Code: Tout sélectionner
SET @a :=0;

DELETE FROM $table WHERE $id NOT IN
(
SELECT $id, @a := @a +1
FROM $table
WHERE @a <20
ORDER BY $order
)


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité