[CLASSEMENT en PHP] tenir compte des égalités

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [CLASSEMENT en PHP] tenir compte des égalités

RESOLU [CLASSEMENT en PHP] tenir compte des égalités

par osiris73 » 06 juil. 2011, 08:13

Bonjour à tous,

Tout d'abord merci de m'avoir répondu aussi vite et bravo à Sadeq pour ses explications

la requete suivante est celle qui me convient parfaitement

Code : Tout sélectionner

SELECT sc1.nbr, sc1.intitule, (SELECT COUNT( * ) +1 FROM `sondage_choix` sc2 WHERE sc1.nbr < sc2.nbr AND sc1.intitule <> sc2.intitule) AS rang FROM `sondage_choix` sc1 ORDER BY rang
Merci encore

bonne journée à tous

Osiris73

Re: [CLASSEMENT en PHP] tenir compte des égalités

par Ryle » 05 juil. 2011, 22:10

Je serais d'avantage de l'avis de sadeq, sans une sous-requête le count() devrait retourner le nombre total d'enregistrement ... Il faut faire attention dans l'utilisation du GROUP BY : il doit normalement lister tous les champs pour lesquels aucune fonction de groupe (sum, avg, min, ...) n'est appliquée.
MySQL a une tolérance et un fonctionnement particulier, mais ils avertissent également du caractère hasardeux de cette pratique :)

Re: [CLASSEMENT en PHP] tenir compte des égalités

par Mazarini » 05 juil. 2011, 15:52

SELECT sc1.nbr, sc1.intitule,(COUNT(*) + 1) AS rang
     FROM `sondage_choix` AS sc1
     JOIN `sondage_choix` AS sc2
     ON sc1.nbr < sc2.nbr GROUP BY sc1.intitule
     ORDER BY rang
Peut être....

Re: [CLASSEMENT en PHP] tenir compte des égalités

par sadeq » 05 juil. 2011, 15:31

Bonjour, je t'explique :
il faut de toutes façons 2 requêtes imbriquées :
1. La requête principale nommée "sc1" aura comme rôle de parcourir les joueurs pour les lister
2. Et la requête imbriquée nommée "sc2" doit avoir comme rôle de calculer le rang de chaque joueur listé par la requête principale "sc1". Pour ce faire elle doit compter le nombre fois où le nombre de votes, d'un joueur positionné par la requête principale nommé sc1.nbr, est inférieur aux nombres de votes des autres joueurs listés par la sous-requête "sc2". Ceci peut s'écrire comme ça pour la sous-requête sc2 qui calcule le rang:
SELECT COUNT(*)  FROM `sondage_choix` sc2 WHERE sc1.nbr < sc2.nbr AND sc1.intitule <> sc2.intitule
Dans le WHERE on peut lire qu'on compare sc1.nbr avec les nbr de sc2 pour simplement les joueurs différents du joueur positionné par la requête principale : "sc1.intitule". Pour éviter d'avoir un rang qui commence à zéro ce qui est normal il faut ajouter un +1 au COUNT. C'est normal car un premier exclusif dont le nombre de vote est supérieur à tout le monde aura un COUNT égal à zéro ; Car on compare sc1.nbr < sc2.nbr.
Donc la requête finale est :
SELECT sc1.nbr, sc1.intitule, (SELECT COUNT( * ) +1 FROM `sondage_choix` sc2 WHERE sc1.nbr < sc2.nbr AND sc1.intitule <> sc2.intitule) AS rang
FROM `sondage_choix` sc1
ORDER BY rang 
 
Où le rang est un champ calculé par une sous-requête.

Voilà.

[CLASSEMENT en PHP] tenir compte des égalités

par osiris73 » 05 juil. 2011, 14:07

Bonjour à tous,

J'ai essayé de faire une requete de ce type pour tenir comptes des egalites de votes mais ca ne fonctionne pas correctement
SELECT sc1.nbr, sc1.intitule,COUNT(*) AS rang
     FROM `sondage_choix` AS sc1
     JOIN `sondage_choix` AS sc2
     ON sc1.nbr <= sc2.nbr GROUP BY sc1.intitule
     ORDER BY rang
Alors sur ma table sondage_choix j'ai la colonne nbr qui est le nombre de vote pour le joueur
la colonne intitule correspond au prenom du joueur
voici le contenu de la table sondage_choix

intitule nbr
TOTO 7
TITI 6
TATA 6
TONTON 3

Quand je lance la requete il me donne le résultat suivant

nbr intitule rang
7 TOTO 1
6 TATA 3
6 TITI 3
3 TONTON 4

Le probleme est que le rang pour TITI et TATA ne correspond pas, il faudrait avoir le 2

Autre probleme

si les 2 premiers ont le meme nombre de vote, par exemple TOTO et TITI et bien la requete m'affiche


nbr intitule rang
7 TOTO 2
7 TITI 2
6 TATA 3
3 TONTON 4

du coup au lieu d'avoir le rang 1 qui s'affiche pour les 1er j'ai le rang 2 ??

merci de tout aide

Osiris73