Eviter des milliers de UPDATE
24 messages
• Page 2 sur 2 • 1, 2
-

MarvinLeRouge - WRInaute impliqué

- Messages: 526
- Inscription: 1 Sep 2004
Question : cette colonne a-t-elle réellement une utilité, puisque le tri obtenu directement depuis le nombre de points donnera exactement le même résultat ?
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
J'ai une solution en 3 requêtes, avec création d'une table intermédiaire rank.
Il existe certainement une solution plus élégante.
Tu devras optimiser les index sur les tables,
et ensuite tester pour savoir si cette méthode est plus rapide ou pas, par rapport à des milliers d'update dans une boucle :
Cette solution gére les cas d'égalité :
- 2 membres ayant le même nbr de point ont le même rank
Structure des tables :
Etape 1 : je vide la table rank.
Etape 2 : Insertion dans la table rank, des points des membres, avec un GROUP BY sur `points` pour tenir compte des ex-aequo
3. Mise à jour du rank de la table membre, en faisant une jointure sur le nombre de points de chaque membre.
Résultat final :
Ce n'est certainement pas la meilleure solution, c'est juste une solution
Il faut tester les perfs sur des milliers d'enregistrement (pense aux index)
Dans la gestion des égalité, ne gère pas les "trous"
Est-ce que tu veux que Log5, ait comme rang 3, ou alors le rang 4 ( pour tenir compte de l'égalité sur le rang 2).
Il existe certainement une solution plus élégante.
Tu devras optimiser les index sur les tables,
et ensuite tester pour savoir si cette méthode est plus rapide ou pas, par rapport à des milliers d'update dans une boucle :
Cette solution gére les cas d'égalité :
- 2 membres ayant le même nbr de point ont le même rank
Structure des tables :
- Code: Tout sélectionner
--
-- Structure de la table `membres`
--
CREATE TABLE `membres` (
`login` varchar(50) NOT NULL default '',
`rank` int(11) NOT NULL default '0',
`points` int(11) NOT NULL default '0',
PRIMARY KEY (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Contenu de la table `membres`
--
INSERT INTO `membres` VALUES ('Log1', 0, 55);
INSERT INTO `membres` VALUES ('Log2', 0, 12);
INSERT INTO `membres` VALUES ('Log3', 0, 55);
INSERT INTO `membres` VALUES ('Log4', 0, 28);
INSERT INTO `membres` VALUES ('Log5', 0, 45);
INSERT INTO `membres` VALUES ('Log6', 0, 150);
INSERT INTO `membres` VALUES ('Log7', 0, 5);
INSERT INTO `membres` VALUES ('Log8', 0, 3);
-- --------------------------------------------------------
--
-- Structure de la table `rank`
--
CREATE TABLE `rank` (
`IDRank` int(11) NOT NULL auto_increment,
`points` int(11) NOT NULL default '0',
PRIMARY KEY (`IDRank`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Etape 1 : je vide la table rank.
- Code: Tout sélectionner
TRUNCATE TABLE `rank`
Etape 2 : Insertion dans la table rank, des points des membres, avec un GROUP BY sur `points` pour tenir compte des ex-aequo
- Code: Tout sélectionner
INSERT INTO `rank` ( `points` )
SELECT `points`
FROM membres
GROUP BY `points`
order by `points` desc
3. Mise à jour du rank de la table membre, en faisant une jointure sur le nombre de points de chaque membre.
- Code: Tout sélectionner
UPDATE `membres`, `rank`
SET `rank` = `IDRank`
WHERE `membres`.`points` = `rank`.`points`
Résultat final :
- Code: Tout sélectionner
Log6 1 150
Log1 2 55
Log3 2 55
Log5 3 45
Log4 4 28
Log2 5 12
Log7 6 5
Log8 7 3
Ce n'est certainement pas la meilleure solution, c'est juste une solution
Il faut tester les perfs sur des milliers d'enregistrement (pense aux index)
Dans la gestion des égalité, ne gère pas les "trous"
Est-ce que tu veux que Log5, ait comme rang 3, ou alors le rang 4 ( pour tenir compte de l'égalité sur le rang 2).
-

mowmow - WRInaute impliqué

- Messages: 975
- Inscription: 3 Nov 2004
Merci pour cette solution, mais en effet, une fonction serait plus rapide et moins compliquée
Oui je préférerais que Log5 aie le rang 4
Par contre le seul problème se pose au niveau des égalités dans la fonction ... Je ne sais pas comment je pourrais gérer ca correctement car en fait j'affiche 20 positions par page, et si 3 personne sont ex eaquo à la position 20,21,22 ... Je ne saurais pas la position exacte.
Par contre le seul problème se pose au niveau des égalités dans la fonction ... Je ne sais pas comment je pourrais gérer ca correctement car en fait j'affiche 20 positions par page, et si 3 personne sont ex eaquo à la position 20,21,22 ... Je ne saurais pas la position exacte.
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
mowmow a écrit:Je pense en effet intégrer ta solution car avec une fonction, il y'a en effet le problème du ex eaquo
Le pb des ex-aequo, n'est pas résolu avec la solution que j'ai proposée, il faudrat certainement l'adapter.
Le pb de la fonction, pour moi qui ne suis pas très doué en mathématiques, c'est qu'il faut trouver une bijection décroissante de I vers I, dont l'image est une séquence d'entier ( 1, 2, ......etc).
En fait je n'ai pas compris comment rank = points / max(points) pouvait ensuite être transformé en 1, 2, 3 ......
C'est pour ça que ta solution avec une fonction m'intéresse, ça me permettra de progresser
-

mowmow - WRInaute impliqué

- Messages: 975
- Inscription: 3 Nov 2004
spidetra a écrit:mowmow a écrit:Je pense en effet intégrer ta solution car avec une fonction, il y'a en effet le problème du ex eaquo
Le pb des ex-aequo, n'est pas résolu avec la solution que j'ai proposée, il faudrat certainement l'adapter.
Le pb de la fonction, pour moi qui ne suis pas très doué en mathématiques, c'est qu'il faut trouver une bijection décroissante de I vers I, dont l'image est une séquence d'entier ( 1, 2, ......etc).
En fait je n'ai pas compris comment rank = points / max(points) pouvait ensuite être transformé en 1, 2, 3 ......
C'est pour ça que ta solution avec une fonction m'intéresse, ça me permettra de progresser
Oui c'est vrai en fait j'avais pas vu que ca donnerait pas les positions, j'ai un peu la tête ailleurs en ce moment.
Pour les problèmes d'ex-aequo j'ai pensé à cette solution : on met dans la table rank le nom du membre + les points, et après on récupère l'IDRank du membre pour l'update, ca marcherait bien comme ca non ?
24 messages
• Page 2 sur 2 • 1, 2
Lectures recommandées sur ce thème :
- Backlinks par milliers....
- indexation de milliers de pages
- Des milliers de sites inaccessibles !
- erreurs apache par milliers
- Adsense des milliers de dollars
- plusieurs centaines de milliers à indexer
- Similitude >90% entre plusieurs milliers de pages
- Des milliers de backlinks variés = le Graal?
- soumettre un site avec des milliers de pages
- Pénalités Indexation milliers de page d'un coup ?
- Google prévoit de recruter plusieurs milliers d'ingénieurs
- Générer des milliers d'annonces pour AdWords
- Adsense peut il bloquer des milliers de sites !
- Annonces ciblées pour des milliers de produits
- Google refuse d'indexer mes milliers de noms ?
Consultez la description détaillée des produits ou services de Google suivants : Google Catalogs
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
