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 :

Aide requête SQL sur le plus mauvais joueur


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut Aide requête SQL sur le plus mauvais joueur
    Bonjour,

    J'ai du mal à effectuer une requête me retournant le plus mauvais joueur.
    Le plus mauvais joueur serait le joueur qui a le plus de défaites (de tous les joueurs confondus) ainsi que le moins de victoires chez les joueurs ayant le plus de défaites en cas de joueurs ex-aequo.

    JOUEUR 1 - 5 Victoires - 2 DEFAITES
    JOUEUR 2 - 1 Victoires - 4 DEFAITES
    JOUEUR 3 - 0 Victoires - 4 DEFAITES

    Actuellement ma requête affiche le Joueur 2 et 3 alors que je ne souhaiterais avoir que le joueur 3


    Voici la structure de la table que j'obtiens pour faire cette requête :

    IDJOUEUR - INTEGER
    VICTOIRES - INTEGER
    DEFAITES - INTEGER

    Ma requête qui ne fonctionne pas (car elle affiche des ex-aequo là où il ne devrait pas y en avoir) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IDJOUEUR, VICTOIRES, DEFAITES
    FROM MATABLE
    WHERE VICTOIRE <= SOME (SELECT VICTOIRES FROM MATABLE) -- je pense que cela coince ici
    AND DEFAITES >= ALL (SELECT DEFAITES FROM MATABLE)
    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut SQL Oracle
    Bonjour,

    En SQL oracle, j'ai trouvé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Joueur, VICTOIRE, DEFAITE
    FROM MATABLE 
    WHERE DEFAITE = (SELECT MAX(DEFAITE) FROM MATABLE) 
    AND  VICTOIRE = (SELECT MIN(VICTOIRE) FROM MATABLE);
    Par contre, ce code ne sort rien si le joueur a le max de défaites et le max de victoires. Pour améliorer le test, vous devriez ajouter une ligne comme celle-ci :
    JOUEUR4 - DEFAITES : 5 - VICTOIRES : 3

    J'espère que cela vous aidera ...


  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Re !

    Grâce à mon collègue Clément qui m'a aidé à trouver une solution, voici le code SQL oracle qui fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT JOUEUR, DEFAITE, VICTOIRE
      FROM MATABLE 
      WHERE DEFAITE = (SELECT MAX(DEFAITE) FROM MATABLE)
        AND VICTOIRE = (
      SELECT MIN(VICTOIRE) FROM(
       SELECT DEFAITE, VICTOIRE, JOUEUR
       FROM MATABLE 
       WHERE DEFAITE = (SELECT MAX(DEFAITE) FROM MATABLE)
      )
    );

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par predalpha Voir le message
    Le plus mauvais joueur serait le joueur qui a le plus de défaites (de tous les joueurs confondus) ainsi que le moins de victoires chez les joueurs ayant le plus de défaites en cas de joueurs ex-aequo.
    Il faut donc classer les joueurs selon cette définition, et prendre le premier !

    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
     
    WITH CTE AS (
        SELECT 
            Joueur
            ,Defaite
            ,Victoire
            ,RANK() OVER (ORDER BY Defaite DESC, Victoire) AS Rk
        FROM MaTable
    )
    SELECT 
            Joueur
            ,Defaite
            ,Victoire
    FROM CTE
    WHERE Rk= 1

  5. #5
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Merci messieurs pour votre aide.

    Les 2 solutions semblent bien fonctionner.
    Je garde la seconde pour la facilité de lisibilité (et parce que je n'utilisais pas les CTE)

    Merci encore à vous.

    PS : pour ceux que l'exemple de aieeeuuuu intéresserait, il manque simplement la clause FROM à l'intérieur du WITH

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par predalpha Voir le message
    PS : pour ceux que l'exemple de aieeeuuuu intéresserait, il manque simplement la clause FROM à l'intérieur du WITH

    En effet, merci de l'avoir indiqué, je vais éditer la requête

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Re bonjour,

    Si je peux me permettre, le fait de prendre le premier joueur ne me semble pas le meilleur choix. En effet, si deux joueurs sont à égalité pour le trophée du pire joueur, en ne prenant que le premier il vous manquera un joueur.

    @predalpha :
    PS : pour ceux que l'exemple de aieeeuuuu intéresserait, il manque simplement la clause FROM à l'intérieur du WITH
    Pourriez-vous ré-écrire le code de Aieeueue sans le manque s'il vous plaît ? Car j'ai l'impression que le FROM est bien dans le WITH. Merci.

    Bonne journée,

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Avec la requête que j'ai proposée, s'il y a deux joueurs exæquo, ils ressortiront tous les deux

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Oh ok ! Merci

    En fait vous avez créé une variable RK alimentée par la fonction RANK() OVER ! Excellent !


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/01/2006, 18h35
  2. requêtes sql sur plusieurs tables
    Par zahiton dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 10h59
  3. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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