8795 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

Ca me marque "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'".

Ce qui est incompréhensible vu que j'utilise la dernière version de mysql.
Modérateur
Hello,

Heyoan a écrit :

Ce serait plutôt
DELETE FROM une_table WHERE id < (Select MAX(id) FROM une_table) - 6;
et c'est à éviter car lourd en ressources.


En effet, je voulais dire un truc dans ce goût là. En revanche les deux requêtes ne fonctionnent pô. Mysql n'accepte pas que la sous-requête soit basée sur la même table apparemment. MAX est lourd en ressource ?

@sff : Je pense que tu devrais mettre sur le forum la structure de ta table « rpg_news ». Comme je l'ai précisé précédemment, pourquoi veux tu supprimer des données ? Manque de place ? Je ne sais pas si c'est judicieux de la faire. Smiley ohwell

Il me vient deux petites idées (arf).

* Regarder si en supprimant les données antérieures à un temps précis ça ferait l'affaire.
* lorsque tu fais un ajout dans ta table, tu récupères l'id et tu exécutes de suite une autre requête basée sur cet identifiant récupéré (id - 6).
sff a écrit :
Ce qui est incompréhensible vu que j'utilise la dernière version de mysql.
A moins que même la dernière version ne permette pas de le faire. Smiley smile
Nolem a écrit :
En revanche les deux requêtes ne fonctionnent pô. Mysql n'accepte pas que la sous-requête soit basée sur la même table apparemment.
Ah oui exact. Cela oblige à le faire en 2 requêtes.

Nolem a écrit :
MAX est lourd en ressource ?
Plus généralement toutes les requêtes de regroupements / d'ensembles.

Nolem a écrit :
Comme je l'ai précisé précédemment, pourquoi veux tu supprimer des données ? Manque de place ? Je ne sais pas si c'est judicieux de la faire. Smiley ohwell

Il me vient deux petites idées (arf).

* Regarder si en supprimant les données antérieures à un temps précis ça ferait l'affaire.
* lorsque tu fais un ajout dans ta table, tu récupères l'id et tu exécutes de suite une autre requête basée sur cet identifiant récupéré (id - 6).
Tout ce dont il est question dans le premier post que j'ai indiqué ! Smiley lol
Modifié par Heyoan (13 Dec 2009 - 17:46)
Modérateur
Heyoan a écrit :

Cela oblige à le faire en 2 requêtes.


Exact, j'ai beau réfléchir, je ne vois pas d'autres moyens de le faire en une seul requête.

Heyoan a écrit :

Plus généralement toutes les requêtes de regroupements / d'ensembles.


Cela voudrait dire que COUNT, DISTINCT, GROUP BY, MIN, MAX, etc. sont plus lourd à gérer. Merci de cette précision. Dans la soirée, je parcourrai un peu mieux le lien de sqlpro.

Heyoan a écrit :
Tout ce dont il est question dans le premier post que j'ai indiqué !


Ha oui, oups Smiley confused Ce n'est pas ce lien que j'ai parcouru.
Modifié par Nolem (13 Dec 2009 - 19:21)
a écrit :
Mysql n'accepte pas que la sous-requête soit basée sur la même table apparemment.

Vous avez déjà essayé avec un truc de ce style ?
delete from table where id not in (select * from (
select id from table
order by id desc limit 6
));

Ca crée une table temporaire implicite. Niveau performance, c'est sûrement pire que max, mais max est techniquement incorrect, parce que ça ne peut marcher que si les id se suivent parfaitement.

Une autre solution possible serait de créer une table temporaire avec ce qu'on veut garder, ensuite on vire tout de la table principale, et on remet ce qu'on a mit dans la table temporaire dans la principale. Plus lourd tu meurs, mais au moins on est sûr que ça marche à tous les coups.
Pages :