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

Requêtes MySQL Discussion :

Requête mal formulée


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut Requête mal formulée
    Bonjour,

    Je vous sollicite parce que je n'arrive pas à écrire ma requête pour afficher des résultats de courses...
    Je m'explique :
    J'ai une table qui contient les résultats de courses aériennes. Toutes les tentatives sont enregistrées. Un enregistrement comprend :
    - pilote (login)
    - nom de la course (race_name)
    - appareil utilisé (aircraft)
    - temps réalisé (time_elapsed)
    - carburant utilisé (fuel_used)
    - type de tentatives (race_mode : Competition)
    - motif de l'arret du chrono (motive : Completed ou Aborted)

    J'aimerais faire un classement en indiquant le meilleur temps pour chacun des pilotes, en indiquant par course et par login, et pour le meilleur chrono trouvé :
    - l'appareil utilisé
    - le carburant utilisé
    - le nombre de tentatives réussies (motive = Completed)
    - le nombre de tentatives total (motive = Completed + Aborted)

    Voici le code SQL que j'ai écrit :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT race_name, login, aircraft, 
      MIN( time_elapsed ) AS min_time_elapsed, 
      TRUNCATE( fuel_used, 3), COUNT(*) 
    FROM `results` 
    WHERE motive = 'Completed' AND race_mode = 'Competition' 
    GROUP BY race_name, login 
    ORDER BY race_name, min_time_elapsed, fuel_used ASC

    Ca correspond pas tout à fait à ce que je souhaites parce que :
    - y'a pas le nombre de tentative total
    - la quantité de carburant utilisé, et l'appareil utilisé ne correspondent pas forcément à l'enregistrement contenant le meilleur temps réalisé...

    Résultats de la requête visible ici : http://www.bravo-mike-tango.org/Resultats_courses.php

    Comme dois je écrire cette requête?
    Merci d'avance de votre aide,
    --
    Benoît

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    J'aimerais faire un classement en indiquant le meilleur temps pour chacun des pilotes,
    ça c'est une requête qui agrège les différentes courses de chaque pilote :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT login, Min(time_elapsed) AS min_time_elapsed
    FROM results
    WHERE motive = 'Completed' AND race_mode = 'Competition'
    GROUP BY login

    en indiquant par course et par login, et pour le meilleur chrono trouvé :
    - l'appareil utilisé
    - le carburant utilisé
    ça par contre, ça suppose une requête qui descende au niveau détail de chaque combinaison course/pilote :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT race_name, login, aircraft, TRUNCATE( fuel_used, 3)
    FROM results
    Pour combiner les deux, il faut dans la requête détaillée une condition qui utilise la sous-requête agrégée, à savoir qu'on ne choisit que les course/pilote qui correspondent au meilleur temps de chaque pilote :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT race_name, login, aircraft, TRUNCATE( fuel_used, 3)
    FROM results AS R
    WHERE motive = 'Completed' AND race_mode = 'Competition'
      AND time_elapsed = (
        SELECT Min(time_elapsed) 
        FROM results AS R2
        WHERE motive = 'Completed' 
          AND race_mode = 'Competition'
          AND R2.login = R.login
      )
    - le nombre de tentatives réussies (motive = Completed)
    - le nombre de tentatives total (motive = Completed + Aborted)
    c'est un nombre de tentatives par pilote, par course, sur les deux ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    lol... je me doutais bien que c'était une requête + des sous requêtes, mais là... j'suis dépassé... On voit bien mes limites.
    Bref, merci de ta réponse Antoun!!!
    Citation Envoyé par Antoun
    c'est un nombre de tentatives par pilote, par course, sur les deux ?
    C'est les deux... Le nombre de tentatives par course et par pilote aussi...
    Bon, je vais essayer de comprendre la première requête que tu m'as communiquée...

    En fait... ton "AS R" (à traduire par "As Relation" je suppose... c'est mémotechnique?), veut dire que la requête formulée précédemment servira à sélectionner les valeurs de l'enregistrement souhaitée (ce que j'arrivais pas à faire).
    Ensuite, tu mets la requête que identifie l'enregistrement voulu... à savoir celui conditionné par MIN( time_elapsed )...
    Bin, je crois que j'ai pas encore compris... il me manque un morceau...

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Citation Envoyé par BMT_Benoît Voir le message
    ton "AS R" (à traduire par "As Relation" je suppose... c'est mémotechnique?), veut dire que la requête formulée précédemment servira à sélectionner les valeurs de l'enregistrement souhaitée (ce que j'arrivais pas à faire).
    Ensuite, tu mets la requête que identifie l'enregistrement voulu... à savoir celui conditionné par MIN( time_elapsed )...
    Bin, je crois que j'ai pas encore compris... il me manque un morceau...
    en fait, c'était juste R pour results Utiliser l'initiale est une pratique courante et, effectivement, mnémotechnique, pour choisir des alias de table.

    Revenons à la question plus fondamentale : la corrélation. J'ai besoin que la sous-requête renvoie le temps minimal du pilote de la requête principale. Pour cela je place dans la sous-requête une condition disant que son pilote (donc R2.login) doit être le même que celui de la requête principale (donc R.login). Comme les deux requêtes portent sur la même table, les alias me permettent de distinguer chaque instance (ou utilisation) de la table.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Ok... c'est comme les relations entre deux tables différentes : member.login et results.login, sauf que... comme les requêtes concernent la même table, t'es obligé d'utiliser des 'alias' pour les différentier! Je comprends mieux...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Super Antoun!!! Merci beaucoup...
    Je viens de finir la requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT race_name, login, aircraft, time_elapsed, TRUNCATE( fuel_used, 3)
    FROM results AS R
    WHERE motive = 'Completed' AND race_mode = 'Competition'
      AND time_elapsed = (
        SELECT Min(time_elapsed) 
        FROM results AS R2
        WHERE motive = 'Completed' 
          AND race_mode = 'Competition'
          AND R2.login = R.login
          AND R2.race_name = R.race_name
      )
    ORDER by race_name, time_elapsed, fuel_used ASC
    Merci de ton aide

Discussions similaires

  1. Regex mal formulé
    Par aA189 dans le forum VB.NET
    Réponses: 6
    Dernier message: 12/07/2011, 22h06
  2. [MySQL] Requête mal formée ?
    Par michaeljeru dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 06/06/2008, 17h40

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