Eviter des milliers de UPDATE

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Eviter des milliers de UPDATE

Message le Lun Sep 19, 2005 6:16

Bonjour tout le monde,,

Alors voilà j'aurais un petit problème, en fait je désire faire un classement de joueurs.

Ceux-ci sont tout d'abord classés selon leur nombre de points en ORDER BY points DESC. J'ai donc la position de ceux-ci dans un tableau. Mon problème est que je dois "updater" le champ "ranking" de chacun des membres.

Ce que je n'arrive pas à faire c'est une requète unique qui pourrait "updater" tous les ranking en une fois. C'est à dire quelque chose qui éviterait ca :

Code: Tout sélectionner
<?php
foreach($classement as $membre => $ranking) {
mysql_query('UPDATE membres SET ranking = "'.$ranking.'" WHERE login = "'.$membre.'"');
}
?>


Ce qui ferait des milliers de requêtes avec tous les membres !

Merci d'avance
Dernière édition par mowmow le Lun Sep 19, 2005 18:24, édité 2 fois.

fredsoft
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 242
Inscription: Dim Jan 26, 2003 22:39

Message le Lun Sep 19, 2005 9:08

je crois que vous n'avez pas d'autre solution...dans tous les cas si la base est bien faite c'est pas forcéement lent.une base de données est faite pour ça
pensez à indexer le champ login

spidetra
WRInaute accro
WRInaute accro
 
Messages: 1500
Inscription: Lun Juil 07, 2003 13:06

Message le Lun Sep 19, 2005 9:33

fredsoft a écrit:je crois que vous n'avez pas d'autre solution...dans tous les cas si la base est bien faite c'est pas forcéement lent.une base de données est faite pour ça
pensez à indexer le champ login


En règle générale il faut éviter de faire des requêtes dans des boucles.
Pour ma part c'est devenu une règle de base :
Jamais de requêtes dans une boucle.

mowmow, Est-ce que tu peux nous poster la structure de tes tables, cela nous aidera à trouver la requête qui va bien.

nodom
WRInaute impliqué
WRInaute impliqué
 
Messages: 316
Inscription: Sam Jan 15, 2005 17:26

Message le Lun Sep 19, 2005 12:34

il faut faire de sorte que la formule de calcul soit dans la requête unique:
UPDATE membres SET ranking =
(select fromule from tables
WHERE .... and table1.login=memebres.login)


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Lun Sep 19, 2005 16:44

En fait après avoir classé les membres selon leur nombre de points, j'update leur position dans le champ ranking dans la meme table.

nodom a écrit:il faut faire de sorte que la formule de calcul soit dans la requête unique:
UPDATE membres SET ranking =
(select fromule from tables
WHERE .... and table1.login=memebres.login)


Ca m'a l'air intéressant, comment je pourrais faire en sorte que ca fasse comme je le voudrais ? Parce que je ne connais pas trop cette syntaxe :(


MarvinLeRouge
WRInaute impliqué
WRInaute impliqué
 
Messages: 451
Inscription: Mer Sep 01, 2004 20:10

Message le Lun Sep 19, 2005 18:19

Il faudrait déjà que ton serveur fasse tourner une version mysql qui admet les sous-requètes, ce qui me parait compromis sur un serveur de prod.

nodom
WRInaute impliqué
WRInaute impliqué
 
Messages: 316
Inscription: Sam Jan 15, 2005 17:26

Message le Lun Sep 19, 2005 18:20

mowmow
comment vous faites pour classer les membres? l'idée d'integrer la méthode de classement dans la requête si c'est possible.


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Lun Sep 19, 2005 18:23

nodom a écrit:mowmow
comment vous faites pour classer les membres? l'idée d'integrer la méthode de classement dans la requête si c'est possible.

SELECT 1 FROM membres ORDER BY points DESC

Pour les sous requêtes ca devrait pas être un problème j'ai un dédié

nodom
WRInaute impliqué
WRInaute impliqué
 
Messages: 316
Inscription: Sam Jan 15, 2005 17:26

Message le Lun Sep 19, 2005 18:26

comment vous faites pour calculer le $ranking de chaque memebre?


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Mar Sep 20, 2005 6:52

Bah en fait j'ai tous les noms dans un array avec comme clé le ranking


MarvinLeRouge
WRInaute impliqué
WRInaute impliqué
 
Messages: 451
Inscription: Mer Sep 01, 2004 20:10

Message le Mar Sep 20, 2005 7:39

mowmow a écrit:
nodom a écrit:mowmow
comment vous faites pour classer les membres? l'idée d'integrer la méthode de classement dans la requête si c'est possible.

SELECT 1 FROM membres ORDER BY points DESC

Pour les sous requêtes ca devrait pas être un problème j'ai un dédié


OK. Donne le nom des tables et leur structure stp.

spidetra
WRInaute accro
WRInaute accro
 
Messages: 1500
Inscription: Lun Juil 07, 2003 13:06

Message le Mar Sep 20, 2005 8:10

mowmow, si tu veux que l'on puisse t'aider :
- bout de code php
- structure des tables

... ça va plus vite, qu'un échange de post


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Mar Sep 20, 2005 16:01

Lol ok c'est tout simple

===================
STRUCTURE TABLE MEMBRES
===================

- login
- ranking
- points

Requête : SELECT login FROM membres ORDER BY points DESC

PHP :
Code: Tout sélectionner
while($row = mysql_fetch_assoc($sql))
$array[] = $row['login'];


Et après je voudrais updater tous les "ranking" des membres avec la clé de array qui représente leur position.

Voilà voilà, je voudrais savoir si c'est possible en une seule requête.

Désolé de pas avoir été assez clair ...[/code]

nodom
WRInaute impliqué
WRInaute impliqué
 
Messages: 316
Inscription: Sam Jan 15, 2005 17:26

Message le Mar Sep 20, 2005 18:53

c'est un peut compliqué mais pas impossible. mais je pense que vous pouvez faire autrement. enfin pour vous le rank c'est la position du memebre en fonction des points
faites ça alors

update membres set rank=f(points)

à la place de f(points) imaginez une fonction.
qui donne des valeurs qui vont le mieux avec votre besoins.
exemple: des valeurs de 0 à 1
"update membres set rank=points/".$max;

$max le nombre de points le plus grand
calculé ave select max(points) from membres
...


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Mar Sep 20, 2005 19:10

Pas mal du tout !! J'y aurais pas du tout pensé ! Merci beaucoup nodom :)

Et après pour récupérer la position réelle, j'ai plus qu'à faire ranking * max_points ! Merci ^^

Eviter des milliers de UPDATE

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités