par
Hubert Roksor » 26 avr. 2006, 00:16
Désolé de m'inviter sans frapper, mais je crois que ce que mike cherche c'est le contraire: il ne veut pas trouver "b" à partir de "100ème", il veut trouver "100ème" à partir de "b" (autrement dit, "quelle est la position de b ?").
Mauvaise nouvelle, il n'y a aucun moyen vraiment facile. Avant tout il faut calculer le nombre de visites par
nom, à la manière de ce qui a été posté plus haut. J'imagine que
nbvisite est un nombre entier positif
Je vais aussi imaginer que tu utilises au moins MySQL 4.1 et je vais utiliser ce résultat dans une
table dérivée, sinon il te faudra créer une
table temporaire. Pour connaitre la position d'un
nom dans le classement il nous faut compter le nombre d'enregistrements le précédant et ajouter
1. Pour ce faire, il nous faut créer une auto-jointure (une table qui se joint à elle-même):
Code : Tout sélectionner
SELECT COUNT(*) + 1 AS rang
FROM (
SELECT SUM(nbvisite) AS total_visites
FROM table
WHERE nom = 'b'
) AS t1
JOIN (
SELECT SUM(nbvisite) AS total_visites
FROM table
GROUP BY nom
) AS t2
ON t2.total_visites > t1.total_visites
Un détail qui pourrait avoir de l'importance :
(je sais, ça en fait un oxymore) il n'y a pas de départage en cas d'ex-æquo. À toi d'ajouter ton propre départage dans la clause ON de la requête. À noter que je n'ai pas testé cette requête, une typo pourrait subsister.
Autre point important: les performances de cette requête se dégradent très rapidement à mesure que la table grossit. Je te recommande vivement d'utiliser un compteur global pour chaque nom plutôt que de faire des SUM(*) et des COUNT(*) à tour de bras

Désolé de m'inviter sans frapper, mais je crois que ce que mike cherche c'est le contraire: il ne veut pas trouver "b" à partir de "100ème", il veut trouver "100ème" à partir de "b" (autrement dit, "quelle est la position de b ?").
Mauvaise nouvelle, il n'y a aucun moyen vraiment facile. Avant tout il faut calculer le nombre de visites par [b]nom[/b], à la manière de ce qui a été posté plus haut. J'imagine que [b]nbvisite[/b] est un nombre entier positif[code]SELECT nom, SUM(nbvisite) AS total
FROM table
GROUP BY nom[/code]
Je vais aussi imaginer que tu utilises au moins MySQL 4.1 et je vais utiliser ce résultat dans une [url=http://dev.mysql.com/doc/refman/5.0/fr/unnamed-views.html]table dérivée[/url], sinon il te faudra créer une [i]table temporaire[/i]. Pour connaitre la position d'un [b]nom[/b] dans le classement il nous faut compter le nombre d'enregistrements le précédant et ajouter [b]1[/b]. Pour ce faire, il nous faut créer une auto-jointure (une table qui se joint à elle-même):
[code]SELECT COUNT(*) + 1 AS rang
FROM (
SELECT SUM(nbvisite) AS total_visites
FROM table
WHERE nom = 'b'
) AS t1
JOIN (
SELECT SUM(nbvisite) AS total_visites
FROM table
GROUP BY nom
) AS t2
ON t2.total_visites > t1.total_visites[/code]
Un détail qui pourrait avoir de l'importance : [size=59](je sais, ça en fait un oxymore)[/size] il n'y a pas de départage en cas d'ex-æquo. À toi d'ajouter ton propre départage dans la clause ON de la requête. À noter que je n'ai pas testé cette requête, une typo pourrait subsister.
Autre point important: les performances de cette requête se dégradent très rapidement à mesure que la table grossit. Je te recommande vivement d'utiliser un compteur global pour chaque nom plutôt que de faire des SUM(*) et des COUNT(*) à tour de bras ;)