Aller au contenu

Sujets conseillés

Posté

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.

Posté

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

Posté
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

Posté

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

Posté (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é par anorci
Posté (modifié)

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:

Modifié par Théo B.
Posté (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é par Hyogapag
Posté (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 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 ;)

Modifié par anorci
Posté

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

Posté

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...