Page 1 sur 1

Place d'un élément dans une table ordonnée

Posté : 24 avr. 2006, 20:21
par mike1155
Bonjour,

Pour simplifier, imaginons que j'ai une table contenant deux champs: nom et nbvisite
Je voudrais connaître le rang d'un enregistement identifié par nom en ordonnant sur la somme des nbvisite. Sachant que j'ai besoin d'avoir des enregistrements différents pour le même nom...

Exemple:
Nom : nbvisite
a : 1
b : 1
c : 1
b : 1
c : 1
b : 1

Je voudrais pouvoir retrouver 1 pour b, 2 pour c et 3 pour a puisque le classement est 1.b ; 2.c ; 3a

Est-ce possible avec une requête sql?

Merci

Posté : 25 avr. 2006, 00:26
par Truc
Salut,
SELECT COUNT(nom) as nb FROM table GROUP BY nom 
devrait te donner ton résultat.

Posté : 25 avr. 2006, 07:09
par mike1155
Merci mais COUNT va me donner le nombre d'enregistrements non?, moi je souhaiterais savoir le classement....

De plus ,j'ai oublié de préciser que nb visite pouvait parfois contenir des données supérieures à 1...

Posté : 25 avr. 2006, 09:37
par zeus
tu remplaces COUNT par SUM et, au lien d'avoir le nombre de lignes, tu auras la sommes des visites

Posté : 25 avr. 2006, 10:46
par mike1155
tu remplaces COUNT par SUM et, au lien d'avoir le nombre de lignes, tu auras la sommes des visites
Ok pour cela, j'aurai la somme des nbvisite pour chaque nom mais je voudrais ordonner cela selon cette somme (ok pas de problème pour ordonner, j'y arrive) mais je désire surtout retrouver la place d'un nom donné dans ce classement (5ème, 8ème, 125ème,...) sans avoir à extraire tous les enregistrements.

J'y arrive en extrayant tous les enregistrements et en travaillant avec php, mais j'aurais voulu savoir si c'était possible avec une seule requête mysql?

Merci beaucoup

Posté : 25 avr. 2006, 22:38
par Truc
Merci mais COUNT va me donner le nombre d'enregistrements non?
je m'a gouré en écrivant :^o

Jette un oeil à LIMIT de mysql ( si tu est sous ce SGBD)

devrait avoir moyen de récupérer le 100ème par exemple:

Code : Tout sélectionner

LIMIT 99,1

Posté : 26 avr. 2006, 00:16
par Hubert Roksor
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

Code : Tout sélectionner

SELECT nom, SUM(nbvisite) AS total FROM table GROUP BY nom
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 ;)

Posté : 26 avr. 2006, 07:17
par mike1155
Bonjour, merci pour l'idée, c'est en effet ce que je cherchais! Je vais voir si je peux adapter cela à mon cas!

Merci