Jump to content
Sign in to follow this  
Hyogapag

Réorganiser une table

Rate this topic

Recommended Posts

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.

Share this post


Link to post
Share on other sites

perso n'utilise pas le champ id pour faire de l'ordre dans ta table mais plutôt un champ dédié nommé 'ordre'.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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.^^

Share this post


Link to post
Share on other sites

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.

Edited by anorci

Share this post


Link to post
Share on other sites

En utilisant PHP et order by :

<?
$i=0;
$nbr=3;//nombre d'enregistrements
while($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 :nono:

Edited by Théo B.

Share this post


Link to post
Share on other sites

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.^^

Edited by Hyogapag

Share this post


Link to post
Share on other sites

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 Nom
LIMIT $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 ;)

Edited by anorci

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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 :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...