Aller au contenu

Methode pour numéroter une table Mysql...


Dams

Sujets conseillés

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

Ca fait plusieurs millions de requête+1 ;)

Quelqu'un connaîtrai t'il le moyen de la faire en 1 requête ??? :D

Merci à toi qui va me permettre d'econnimiser mon CPU :)

Modifié par Dams
Lien vers le commentaire
Partager sur d’autres sites

Si tu fait ca tu incremente la valeur numero... Tu n'a pas des champs numeroté du type

1

2

3

4

;)

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

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

Trop long

Lien vers le commentaire
Partager sur d’autres sites

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:

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Soit ma table MESVILLES avec les champs suivants VILLE, POPULATION.

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 :

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

Modifié par petit-ourson
Lien vers le commentaire
Partager sur d’autres sites

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' :D

Lien vers le commentaire
Partager sur d’autres sites

Si si ca marche les sous requetes.. je les utilisent tous les jours, mais sous mysql 4 ;)

En fait la question est comme le dit petit-ourson de savoir si:

Dans une sélection, on a un moyen de savoir sur quel ligne on se trouve 

:)

J'ai pas encore trouvé...

Lien vers le commentaire
Partager sur d’autres sites

...

Pour ceux qui ne mettent pas de champs auto_increment, il reste la solution :

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

Lien vers le commentaire
Partager sur d’autres sites

Dans mon cas je n'utilise pas php ;)

Je réalise directement les requêtes sur le serveur mysql :)

Modifié par Dams
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Je pense qu'on tiens la soluce ;)

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)

Lien vers le commentaire
Partager sur d’autres sites

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

;)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

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



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