Version complète: sur le forum Webmaster Hub : Methode pour numéroter une table Mysql...
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Dams
Bonjour,

Je souhaiterai numéroter les lignes d'une table en fonction d'un ordre particulier...

Cela équivaut à un :
SELECT `id` FROM `mytable` ORDER BY (Mon tri wink.gif ) Avec `id` unique bien sur..

Et pour chaque ligne je fait un:
UPDATE `mytable` SET `numero`=$I WHERE `id`=$id

Super pour quelques milliers d'enregistrement.... Mais pour plusieurs millions sad.gif
Ca fait plusieurs millions de requête+1 wink.gif

Quelqu'un connaîtrai t'il le moyen de la faire en 1 requête ??? biggrin.gif

Merci à toi qui va me permettre d'econnimiser mon CPU smile.gif
Anonymus
Comme ca, ca devrait aller :
CODE
UPDATE mytable SET numero=numero+1 WHERE id=$id
Dams
Si tu fait ca tu incremente la valeur numero... Tu n'a pas des champs numeroté du type
1
2
3
4
wink.gif

Un exemple réél de ce que je veux:
Prenons ma base des 720 000 sites Yoovi...

J'ai une table des 72000 sites avec comme champs
POSIT (La position)
iddom L'id unique du domaine wink.gif
score Le score...

Je rempli la table en une seule requete en renseignant iddom et score...
Mais la postion n'est pas determiné...

Je fait un:
SELECT iddom FROM `matable` ORDER BY `score`

Et derriere je fait des UPDATE sur position dans une boucle... Avec la position incrementé a chaque passage sad.gif
Trop long
Berberber
jette un coup d'oeuil à cette discussion, je pense avoir eu le même problème que toi : http://www.webmaster-hub.com/index.php?showtopic=6217
thewiseoldman
Je ne vois pas comment faire si ce n'est avec les fonctions mysql_insert_id ou LAST_INSERT_ID() voir http://fr.php.net/mysql_insert_id pour de plus amples informations.

L'idée est donc de récupérer l'id ou numéro de l'enregistrement courant du résultat.

Trié sur le score descendant, le premier résultat aura l'id 1 qui correspond à sa position, je sais pas si je suis clair unsure.gif
sarc
Je ne pense pas que tu puisses faire cela en une seule requete... j'ai beau chercher, je ne vois pas ! Vu qu'il y a forcément une clause "where", tu ne peux le faire que d'une requete a une requete :s

Enfin, si j'ai une idée sublime dans la nuit, je te dis ca demain wink.gif
Dams
Merci ca me donne des pistes smile.gif

Je planche sur tout ca !!! Et je reviens smile.gif
petit-ourson
Dans une sélection, on a un moyen de savoir sur quel ligne on se trouve ?
petit-ourson
Soit ma table MESVILLES avec les champs suivants VILLE, POPULATION.

CODE
SELECT * FROM MESVILLES ORDER BY POPULATION

On obtient une liste des villes classée par population.

Créons une nouvelle table MESVILLESCLASSEES avec comme champ supplémentaire un auto_increment de type int que l'on nommera CLASSEMENT

Il nous reste à effectuer la requête suivante :

CODE
INSERT INTO MESVILLESCLASSEES (VILLE,POPULATION)
SELECT *
FROM MESVILLES ORDER BY POPULATION

Nous nous retrouvons ainsi avec une tables MESVILLES sans classement et une table MESVILLESCLASSEES avec un champ supplémenaire correspondant un classement.

NB: Ca fonctionne sous MySQL et je pense que ca doit fonctionner ailleurs car ça me semble normaliser comme insert (mais à vérifier).

EDIT: J'aurai du supprimer l'autre mais je trouve pas où cela se passe :-(
Anonymus
Il me semble que les 'sous-requetes' ne marchent pas, avec mysql, mais ca vault la peine d'être essayé.

Tu devrais aussi jeter un oeil à ceci :
http://www.dwam.net/docs/mysql3.23/manuel_...t-rollback.html
Ca explique notamment pourquoi mysql est 2 à 4 fois plus rapide que bien d'autres sql, mais pourrait aussi te donner des 'tuyaux' pour ton 'casse tete' biggrin.gif
petit-ourson
J'ai testé avec un exemple et sous mysql 4.0.18, ça fonctionne.

Comme je n'ai rien inventé voici ma source : 14.1.4.1 Syntaxe de INSERT ... SELECT
Dams
Si si ca marche les sous requetes.. je les utilisent tous les jours, mais sous mysql 4 wink.gif

En fait la question est comme le dit petit-ourson de savoir si:
CITATION
Dans une sélection, on a un moyen de savoir sur quel ligne on se trouve 


smile.gif

J'ai pas encore trouvé...
Anonymus
...
Pour ceux qui ne mettent pas de champs auto_increment, il reste la solution :
CITATION
mysql_field_seek
(PHP 3, PHP 4 , PHP 5)

mysql_field_seek --  Déplace le pointeur de résultat
Description
int mysql_field_seek ( resource result, int field_offset)


Place le pointeur de résultat sur le champ spécifié. Lors du prochain appel à mysql_fetch_field() qui n'aura pas d'argument d'index de champ, le champ désormais pointé sera retourné.

Voir aussi mysql_fetch_field().


Bon courage wink.gif
Dams
Dans mon cas je n'utilise pas php wink.gif

Je réalise directement les requêtes sur le serveur mysql smile.gif
thewiseoldman
Ca ne sera pas possible alors, sauf si la table est recrée à chaque changement du classement, avec un auto increment sur le champ position, la table devra être recréée avec les enregistrements déjà triés sur le score descendant.
petit-ourson
Et ca n'a pas marché mon exemple en passant par une table temporaire ? C'est pas ce que tu voulais ?
Dams
Je pense qu'on tiens la soluce wink.gif

Passer par 1 table temporaire avec le champs position en auto increntation c'est le top....

On a besoin de 4 requetes Mais c'est acceptable...

1) Création de la table temporaire
2) Insertion des valeurs de la table a trier vers la Table temporaire.
3) Supression de la table Originale
4) Renommer la table temporaire en table principale...


B)
Anonymus
Inverses le 3) et le 4). Si jamais ca plante entre les 2, tu auras toujours une table 'valide'.
table_ok => table_bak
table_temp => table_ok

wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.