Mysql: Effacer tout ce qui est au-dessus d'une limite
8 messages
• Page 1 sur 1
- seabird
- WRInaute occasionnel

- Messages: 308
- Inscription: 1 Déc 2003
Mysql: Effacer tout ce qui est au-dessus d'une limite
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:
J'ai pensé faire 2 requètes:
Une pour connaitre le nombre de ligne et une pour effacer.
Mais il semble apparemment que Delete ne supporte pas un Limit à 2 arguments.
J'ai essayé tout simplement d'écrire pour voir:
qui fonctionne correctement
par contre :
ne fonctionne pas.
Si vous avez une idée je suis preneur
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
-

YoyoS - WRInaute accro

- Messages: 3835
- Inscription: 14 Sep 2006
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 ?
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

- Messages: 308
- Inscription: 1 Déc 2003
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é

- Messages: 1542
- Inscription: 11 Mai 2005
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 :
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

- Messages: 308
- Inscription: 1 Déc 2003
Bon ce que j'ai fait pour finir:
Je veux etre sur par exemple de garder 2000 enregistrements.
J'efface la table:
et je réécris:
et après je ne sélectionne que les 20 plus importants.
Ca me parait un peu lourd , mais bon ça marche.
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é

- Messages: 913
- Inscription: 5 Aoû 2003
Re: Mysql: Effacer tout ce qui est au-dessus d'une limite
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
)
8 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- effacer es doublons d'une table mysql [script]
- [MySQL] Comment effacer simplement la dernière entrée ?
- [resolu] delete mysql au dessus d'une limite
- Limite pour les bases MySql (OVH)
- [PHP/MySQL/xHTML] Création et changement de page à une limite
- Intégration Adsence possible ou limite ? (ou hors limite)
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Passage à l'heure d'été/hiver sur un forum phpBB - 31-10-2010
- Conseils d'optimisation de la balise TITLE (titre d'une page HTML) - 04-08-2008
- Script de mise en cache des pages (PHP MySQL) - 09-08-2010
- GoogleStats : analyse temps réel des visites de Google sur votre site - 02-10-2002
- Sortie officielle de GoogleStats v2.0 ! - 23-02-2003
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
- Conférence sur le développement web (technologies Microsoft) - 09-05-2006
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité
