IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête capable d'effectuer un classement


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut Requête capable d'effectuer un classement
    Bonjour, je dispose d'une table SCORE, avec les colonnes suivantes :

    idScore
    idTeamGagnante
    idTeamPerdante
    scoreTeamGagnante
    scoreTeamPerdante

    Mon but est de trouver une fonction SQL qui va générer un classement... Malheureusement, je n'ai aucune idée de la requête à appliquer...

    Il faudrait en effet calculer le nombre de partie gagnée pour chaques équipes, ainsi que le nombre perdu, et faire un classement ORDER BY ratio. Avec le ratio = nbVictoire/nbDefaite....

    Petit bonus, il faudrait ne pas inclure les équipes dont le nombre de matchs (gagnés+perdus) est inférieur à N...

    Merci.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Si tu nous indique la requête que tu as commencé à faire et les erreurs que tu rencontres, nous pourrons peut-être commencer à pouvoir t'aider.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Utilisez les fonctions RANK(), DENSE_RANK() ou PERCENT_RANK(). Elles font partie de la norme SQL.

    A lire : http://sqlpro.developpez.com/article...-window/#LVIII

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Bonjour, je suis dans un blocage immense... Le but de mon projet est d'effectuer un classement d'équipe, j'ai passé une dizaine d'heure à coder tout, la soumission des scores, la création d'équipe, les fonctionnalités d'administration... Tout marche impeccablement bien, j'ai mes score, seulement, impossible de les classer....
    J'aimerai avoir quelque chose comme ceci :

    1 - Bisounours Team (2.87)
    2 - FRAGERS (2.71)
    3 - Magic (2.19)
    4 - xPlod (1.98)

    Classement, nom, ratio...

    Voilà ce que j'ai tenté de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function afficherClassement(){
    $req = $bdd->query('SELECT iDteamGagnante , (count (iDteamGagnante)/count(iDteamPerdante)) AS ratio
    		FROM score
    		GROUP BY iDteamGagnante
    		WHERE count(iDteamGagnante + iDteamPerdante)> 10
    		ORDER BY ratio');
    while($data = $req->fetch()){
    echo $data["iDteamGagnante"]." - ".$data['ratio'];
    }
    }

    L'erreur ?

    Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\ladder\site\fonctions.php on line 363


    Donc, ma requête ne récupère rien du tout, donc elle ne fonctionne pas... Et je n'sais pas du tout comment la faire marcher...
    En plus, là ça m'afficherait l'ID de la team gagnante... Mais j'aimerais afficher le nom. J'ai une table TEAM qui contient idTeam et nomTeam, je sais que je suis supposé faire une jointure, mais appart les NATURAL JOIN, je galère un peu... J'y arrive quand c'est la seule difficulté (à mes yeux), mais là il y a trop de choses hors de ma porté pour que j'y arrive... J'attends votre aide pour pouvoir avancer.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    pour les jointures c'est par ici : http://sqlpro.developpez.com/cours/sqlaz/jointures/

    et les group by c'est par ici :http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    Suite à la lecture de ces cours vous verrez que votre syntaxe n'est pas bonne.

    Sinon y a des règles pour ce forum :
    http://www.developpez.net/forums/a69...gage-sql-lire/

  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function afficherClassement(){
    $req = $bdd->query('SELECT iDteamGagnante , (count (iDteamGagnante)/count(iDteamPerdante)) AS ratio
            FROM score
            GROUP BY iDteamGagnante
            WHERE count(iDteamGagnante + iDteamPerdante)> 10
            ORDER BY ratio');
    while($data = $req->fetch()){
    echo $data["iDteamGagnante"]." - ".$data['ratio'];
    }
    }
    Votre requête est mal structurée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM ...
    WHERE ...
    HAVING ...
    GROUP BY ...
    ORDER BY ...
    De plus il n'est pas possible d'utiliser des count dans le where, allez voir du côté du having.

    Il faut bien que vous utilisiez un JOIN pour récupérer les noms des équipes.

    Mais l'erreur vient du fetch() qui n'est pas du SQL. Je vous conseillerez d'aller voir dans le forum du langage utilisé.
    ~ Lola ~

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut Oui...
    Je comprends bien qu'il y ait des règles mais il s'agit d'un cas d'urgence, si j'avais le génie pour lire et savoir le faire immédiatement, je ne vous importunerais point... Malheureusement, je n'ai aucune idée du fait qu'il faille davantage faire un GROUP BY, telle ou telle jointure, et encore moins les différents mélanges adéquats pour obtenir le bon résultat. J'ai une soutenance orale demain, donc j'aurai besoin qu'on me mâche le travail, juste une fois, 5 lignes de code sur plusieurs milliers, est-ce trop?


    Je viens de me rendre compte du problème... C'est que si je selectionne idTeamGagnante, je n'ai pas les team qui ont perdu tout leurs matchs d'afficher... Et il y a d'autres soucis à peine explicables... Sachant qu'ensuite j'ai encore un autre soucis, c'est que les teams appartiennent à des idJeux différents et qu'il faut faire un classement par jeu...


    idScore iDteamGagnante iDteamPerdante scoreTeamGagnante scoreTeamPerdante idSoumetteur urlScreenShot Date estAccepte
    10 11 12 16 10 29 URL 2012-06-26 1
    12 12 11 30 7 27 URL 2012-06-26 1
    13 12 11 15 12 27 URL 2012-06-26 1
    14 12 11 17 15 27 URL 2012-06-26 1
    15 11 12 12 6 27 URL 2012-06-26 1
    16 11 12 12 6 27 URL 2012-06-26 1
    17 12 11 30 13 27 URL 2012-06-26 1

    Comment puis-je classer ceci? Si besoin j'envoie mon projet à n'importe quelle âme charitable.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Voilà tous les éléments :

    TABLE : team
    COLONNES : idTeam idJeu nomTeam tag

    TABLE : score
    COLONNES : idScore iDteamGagnante iDteamPerdante scoreTeamGagnante scoreTeamPerdante idSoumetteur urlScreenShot Date estAccepte

    BUT :
    Afficher un classement de team, le score doit être accepté (estAcccepte = 1)
    Le classement se fait par ratio, c'est à dire totalVictoires/totalDefaites... Si le total de defaites = 0, alors on divise par 1...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Le problème n'est pas d'avoir une soutenance demain, c'est de s'y prendre seulement maintenant alors que la soutenance est demain ...

    Si on te mache la travail tu vas trouver ça fantastique, mais tu risques de te faire démolir par le jury s'ils se rendent compte que tu ne comprends ta propre requête
    Le Porc est un loup pour le Porc.

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    décomposez votre problème.

    Déjà faites la requête pour compter les parties gagnantes
    Ensuite celle pour les partie perdante.

    De ces deux requête vous pourrez obtenir votre résultat en suivant ce modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    select a.nomTeam, 
    COALESCE(b.count_gagnant, 1) / COASLESCE(c.count_perdant, 1)
    from team a
    left outer join
    	( -- Requete partie gagnante
    		select ...
    		from ...
    		group by
    	) as b on a.idTeam = b.idTeamGagnante
    left outer join 
    	(-- Requete partie perdante
    		select ...
    		from ...
    		group by
    	) as c on a.idTeam = c.iDteamPerdante

  11. #11
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Visiblement, vous n'y connaissez rien et ne faites pas d'effort pour y arriver. De plus, vous vous y prenez à la dernière minute et comptez sur les autres pour faire votre travail...

    Désolée, mais s'il m'arrive de faire le travail de quelqu'un d'autre, je me fais payer pour...

    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Je ne suis qu'en première année de DUT ! J'ai un projet à faire en 3 jours, je ne suis même pas en vacances. Je code un jeu en ligne à coté sur mon temps libre, j'ai bossé hier soir jusque 5h. Je fais des choses qui dépasse le niveau général, mais là je bloque...

    Je vois qu'ici on a de bons robots, qui ont pu oublié qu'ils étaient des êtres humains avant tout et ce qu'était l'empathie, l'altruisme... Quel monde horrible, on a plus rien sans rien...

  13. #13
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    C'est trop triste, j'ai versé une larme.

    Je sors moi même de mon BTS, je ne suis jamais venu réclamer qu'on me fasse mon boulot ici, j'avais des profs qui étaient là pour m'expliquer, et mes questions je les posais pas la veille de ma soutenance sur un forum ...

    Comprends bien qu'on peut te pondre ton code, mais comprends surtout que ça ne servira strictement à rien, bien au contraire, car si on te pond un truc qui n'est pas de ton niveau et que l'examinateur trouve ça suspect, il va te poser des questions dessus et tu vas te faire démolir à ta soutenance ...
    Le Porc est un loup pour le Porc.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    J'étais à 17 de moyenne en SQL, mais en première année ce sont les notions basiques... Je travaille beaucoup, j'ai d'excellents résultats... Je suis plutôt le genre qui comprend dès qu'il a la réponse sous les yeux, et je saurais le refaire plus tard...

  15. #15
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par passio Voir le message
    J'étais à 17 de moyenne en SQL, mais en première année ce sont les notions basiques... Je travaille beaucoup, j'ai d'excellents résultats... Je suis plutôt le genre qui comprend dès qu'il a la réponse sous les yeux, et je saurais le refaire plus tard...
    Je vous signale qu'au lieu de raler parce qu'on vous donne pas la solution vous devriez vous mettre à travailler sur ce que vous as donné punkoff qui résous votre problème.

    Est-ce que vous avez fait les deux requêtes dont il a parlé ?
    ~ Lola ~

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Je viens de demander, les profs d'OMGL ne sont pas là... Sinon j'aurais été leur demander.
    Je suis le genre hyperlong à la détente, et je suis très long pour assimiler de nouvelles notions... J'ai du mal à comprendre certaines commandes SQL que je n'ai jamais utilisé... Disons qu'il y a trop de notions nouvelles en même temps pour ne pas me décourager... J'étais responsable du projet, j'ai divisé le travail en 3 pour que nous codions le site, mais un WEEKEND plus tard, + une matinée de Lundi, quand je suis arrivé ô désespoir, ils n'arrivaient toujours pas à se connecter au site !!! J'ai du coder un projet prévu pour 4 personnes et prévu pour 5 jours en 2 jours (cette nuit et aujourd'hui).. Je n'ai pas fini je n'ai pas le temps d'apprendre, j'ai encore un rapport à faire, les diagrammes etc... Ne doutez pas de ma volonté, mais je vous demande un coup de pouce...

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Si vous calez en SQL pur, pourquoi ne pas traiter le classement par code en PHP ? Dans votre situation, ça peut peut être vous tirer d'affaire.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    J'ai réussi à faire un :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT (SELECT count(*) 
     FROM score 
     WHERE iDteamGagnante = 11 
     GROUP BY iDteamGagnante)
    /(SELECT count(*) 
     FROM score 
     WHERE iDteamPerdante = 11 
     GROUP BY iDteamPerdante)

    Ceci marche pour UNE team... Je dois la renseigné (ici j'ai mis 11), quelqu'un saurait-il l'améliorer pour que cela marche pour chaque team ?

  19. #19
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Afin de rendre les requêtes plus agréables à lire pensez à utiliser la balise code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (SELECT count(*) FROM score WHERE iDteamGagnante = 11 GROUP BY  iDteamGagnante) / (SELECT count(*) FROM score WHERE iDteamPerdante = 11  GROUP BY iDteamPerdante)
    Normalement votre requête telle quelle ne devrait pas marcher : vous n'avez pas de FROM. De plus le GROUP BY n'est pas utile car aucune autre colonne n'est présente avec le count.

    Je vous conseillerai de passer vos requêtes en sous-requête.
    Afin d'afficher les scores pour chaque team il suffit de rajouter IDteamPerdante/Gagnante à côté de votre count :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT iDteamGagnante, count(*) 
    FROM score 
    GROUP  BY  iDteamGagnante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT iDteamPerdante, count(*) 
    FROM score 
    GROUP BY iDteamPerdante
    ~ Lola ~

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 49
    Points : 18
    Points
    18
    Par défaut
    Je conçois que ça vous paraisse facile... quand on a le modèle en tête, toutes les connexions se créent en 1 secondes et on prend instantanément conscience du but à atteindre, mais quand on est dans ma situation, ça ne m'aide pas beaucoup.... ça fait 3h que je cherche, ainsi qu'une partie de la nuit...

Discussions similaires

  1. Lenteur requête Capabilities - WMTS
    Par kattig dans le forum IGN API Géoportail
    Réponses: 10
    Dernier message: 11/09/2012, 22h55
  2. tester la validité d'une requête sans l'effectuer
    Par Jasmine80 dans le forum SGBD
    Réponses: 7
    Dernier message: 01/06/2012, 14h44
  3. Réponses: 1
    Dernier message: 03/12/2007, 19h22
  4. Requête pour effectuer un classement
    Par gids01 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/04/2007, 14h47
  5. [MySQL] Ma requête php n'effectue pas la modification
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 01/03/2006, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo