Hyogapag Posté 18 Mars 2006 Posté 18 Mars 2006 Bonsoir. Je souhaiterais effectuer quelques modifications sur l'une des mes tables SQL à l'aide d'une requête, dont malheureusement je ne connais pas la syntaxe et à propos de laquelle je ne parviens pas à trouver de renseignements. La table en question possède une vingtaine de champs, mais juste 2 nous intéressent. Le champ id et le champ nom. Le champ id est ma clé d'index primaire, et est configuré pour s'incrémenter de 1 à chaque nouvelle entrée. Le numéro id correspond donc à l'odre dans lequel la table a été renseignée. Je voudrais réorganiser ma table par ordre alphabétique des noms, c'est-à-dire trier les "fiches" par ordre alphabétique du champ nom, et changer l'id pour qu'il corresponde à cet ordre. Une fois cette opération terminée, j'aimerais que si de nouvelles données sont saisies, la nouvelle fiche ait pour id l'id la plus élevée+1 (que ça fonctionne comme avant pour les fiches rentrées ensuite en fait...) J'ai bien chercher des renseignements sur Google mais en vain. En vous remerciant par avance.
yep Posté 18 Mars 2006 Posté 18 Mars 2006 perso n'utilise pas le champ id pour faire de l'ordre dans ta table mais plutôt un champ dédié nommé 'ordre'.
xpatval Posté 19 Mars 2006 Posté 19 Mars 2006 Une fois cette opération terminée, j'aimerais que si de nouvelles données sont saisies, la nouvelle fiche ait pour id l'id la plus élevée+1 (que ça fonctionne comme avant pour les fiches rentrées ensuite en fait...) C'est là où j'ai du mal à comprendre...Si il y a une nouvelle entrée, donc un nouveau nom , comment celui-ci se calera-t-il dans "l'ordre alphabétique" ? xpatval
Hyogapag Posté 19 Mars 2006 Auteur Posté 19 Mars 2006 Justement, je ne veux pas qu'il se cale. Je veux que le classement continue comme si de rien n'était. Par exemple, avant le classement : 1. Pierre 2. Alain 3. Jacques Après : 1. Alain 2. Jacques 3. Pierre Et si on rajoute un 4e nom : 1. Alain 2. Jacques 3. Pierre 4. Jean C'est vrai qu'avec un exemple c'est plus parlant.
Spidetra Posté 19 Mars 2006 Posté 19 Mars 2006 (modifié) Ne touche pas à la structure de ta DB. Laisse ta clé primaire en auto-incrément. Ne te préoccupe pas de la manière ton SGBD insère et tri les enregistrements. Fais lui confiance te laisse le faire. Ta solution est très simple en SQL. SELECT * from TABLE ORDER BY Nom Cette solution ne te convient pas ? En fait je ne comprend pas trop ce que tu veux faire. De plus, si tu change les ID, et que ta table est lié à d'autres tables, tu va mettre toute ta base en vrac. Modifié 19 Mars 2006 par anorci
Théo B. Posté 19 Mars 2006 Posté 19 Mars 2006 (modifié) En utilisant PHP et order by : <?$i=0;$nbr=3;//nombre d'enregistrementswhile($i<$nbr){$query='UPDATE test SET id='.$i.' ORDER BY nom DESC LIMIT '.$i.','.$i+1';if(!mysql_query($query)){echo mysql_errno().' : '.mysql_error();}$i++;}?> Sinon, il doit y avoir possibilité de faire des boucles mysql en incrémentant les variables, mais ça dépasse mes compétences Modifié 19 Mars 2006 par Théo B.
Hyogapag Posté 19 Mars 2006 Auteur Posté 19 Mars 2006 (modifié) En fait, le problème est que si je fais : SELECT * FROM ma_table WHERE (condition quelconque) AND LIMIT BETWEEN valeur1 AND valeur2 ORDER BY nom alors effectivement il y aura un classement alphabétique, mais sur chaque page et non sur la totalité des résultats (c'est-à-dire sans le limit). Autrement dit, si je veux 3 résultats par page, sur la première page j'aurai 3.Alain 1.Paul 2.Pierre sur la seconde 4. André 6. Jacques 5. Vincent etc. Sinon je n'ai pas de table liée, donc pas de problème de ce côté là. La solution de Théo me convient assez, je n'ai plus qu'à faire quelques modifications, mais j'aurais voulu une requête sans PHP, que j'aurais pu directement rentrer dans mon SGBD. Enfin si personne n'a mieux, je me contenterai de ça (c'est déjà pas mal). EDIT : j'ai réussi à faire ce que je voulais. J'ai supprimé mon champ id, puis j'ai fait la requête : ALTER TABLE ma_table ORDER BY nom puis j'ai recréé un champ id que j'ai mis avec les mêmes options que l'autre (clé primaire et auto-increment) et voilà c'est bon. Modifié 19 Mars 2006 par Hyogapag
Spidetra Posté 20 Mars 2006 Posté 20 Mars 2006 (modifié) Je pense que tu cherches une mauvaise solution a un pb simple. C'est vraiment très très très rare d'avoir besoin de réorganiser une table comme tu viens de le faire. Ton pb se règle trés facilement en SQL : SELECT *FROM Table WHERE ( listes de conditions quelconques )ORDER BY NomLIMIT $1, $2 C'est l'impl"mentation classique d'un pager en mySQL. Et ça marche très bien. La syntaxe de ta requête SQL était fausse, et tu aurait dû commencer par la poster. Toujours choisir la solution la plus simple a un pb Modifié 20 Mars 2006 par anorci
NorSeb Posté 20 Mars 2006 Posté 20 Mars 2006 Bonjour, alors effectivement il y aura un classement alphabétique, mais sur chaque page et non sur la totalité des résultats (c'est-à-dire sans le limit). Tu as testé ca ?? Parce qu'il me semble que c'est faux...
Anonymus Posté 22 Mars 2006 Posté 22 Mars 2006 La clause LIMIT d'une requète sql intervient dans le résultat à la fin seulement du calcul des résutalts. Autrement dit, ta requète sera faite entièrement, et seulement après interviendra la clause LIMIT. Autrement dit, la clause LIMIT influencera la totalité de la table, et pas seulement les résultats retournés. Pour le 'id' que tu veux réorganiser, ca ne sert absolument à rien. L'id increment est un numéro unique, quelqu'il soit. C'est un nombre qui augmente de 1, mais ca pourrait aussi bien être une chaine de caractères, comme ca se passe pour certaines tables. Réorganiser ce champ est plutot contraire au principe même de ce champ
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant