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

  • Auteur de la discussion Auteur de la discussion seabird
  • Date de début Date de début
WRInaute occasionnel
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:
$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:
$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:
$query ="DELETE FROM $table  LIMIT 2";
$result = mysql_query($query);
qui fonctionne correctement

par contre :
Code:
$query ="DELETE FROM $table  LIMIT 1,2";
$result = mysql_query($query);
ne fonctionne pas.

Si vous avez une idée je suis preneur :)
 
WRInaute occasionnel
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 ..
 
WRInaute accro
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 ?
 
WRInaute occasionnel
YoyoS a dit:
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.
 
WRInaute passionné
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:
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;
 
WRInaute occasionnel
Bon ce que j'ai fait pour finir:
Je veux etre sur par exemple de garder 2000 enregistrements.
Code:
select * from $table ORDER BY nombre DESC LIMIT 0,2000

J'efface la table:
Code:
TRUNCATE TABLE $table

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

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

Ca me parait un peu lourd , mais bon ça marche.
 
WRInaute impliqué
arnaudmn a dit:
seabird a dit:
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:
SET @a :=0;

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