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êtes imbriquées avec MAX


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Requêtes imbriquées avec MAX
    Bonjour,

    J'ai passé pas mal de temps à chercher une solution avant de me résoudre à poser la question ici car malgré tout je ne trouve toujours pas de solution à mon problème (sûrement par manque de pratique récente du SQL...).
    Je dois faire une requête sur 3 tables dont voici un mini MPD

    RDV
    id_rdv
    date_rdv


    RDV_A_STATUT
    #rf_id_rdv
    #rf_id_statut
    #date_rdv_a_statut

    STATUT
    id_statut
    code_statut
    libelle_statut

    les jointures sont assez usuelles, avec id_rdv=rf_id_rdv et id_statut=rf_id_statut.

    Jusque là rien de bien folichon.

    A la base, une bête requête avec une CIF du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id_rdv, date_rdv, date_rdv_a_statut, libelle_statut, code_statut
    FROM rdv, rdv_a_statut, statut
    WHERE id_rdv = rf_id_rdv
    AND id_statut = rf_id_statut
    Vous vous douterez bien que cette requête renvoit plein de doublons...

    Pire que ça, je veux tous les RDV dont le dernier statut (obtenu via la date de statut => date_rdv_a_statut) a le code_statut='moulu'.
    J'ai eu beau tournicoter la requête dans un peu tous les sens, je ne trouve toujours pas la solution, j'ai du mal à obtenir ce fameux dernier statut en date...

    Quelqu'un pourrait-il me donner un p'tit coup de main?

  2. #2
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Première chose à faire : écrire les jointures correctement. La méthode que vous utilisez n'est plus valable depuis des années, d'après les experts du forum.
    Voir le cours : Les jointures, ou comment interroger plusieurs tables

    Pour le suite, je galère trop moi-même avec les max que je ne peux pas être d'une grande aide.

    Pierre

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par pier.antoine Voir le message
    Bonjour

    Première chose à faire : écrire les jointures correctement. La méthode que vous utilisez n'est plus valable depuis des années, d'après les experts du forum.
    Voir le cours : Les jointures, ou comment interroger plusieurs tables

    Pour le suite, je galère trop moi-même avec les max que je ne peux pas être d'une grande aide.

    Pierre
    Promis pour le vrai code, je mettrai les join qu'il faut...
    Ma question était vraiment plus sur la gestion du MAX etc plutôt que sur la jointure (même si je sens un petit outer join quelque part...mais pour l'instant là n'est à priori pas la question.

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    On peut décomposer le problème ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select rf_id_rdv,max(date_rdv_a_statut)
     
    from RDV_A_STATUT inner join STATUT
     
    on rf_id_statut = id_statut
     
    where code_statut = "moulu"
     
    group by rf_id_rdv
    Ce select nous donne la date de rdv max par id avec le statut moulu

    Ensuite basiquement
    on peut faire une jointure entre RDV et notre select précédent (ou sous-requête maintenant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select id_rdv, date_rdv 
    from RDV, (select 
    rf_id_rdv,
    max(date_rdv_a_statut) as MaxDRdv
    from RDV_A_STATUT inner join STATUT
    on rf_id_statut = id_statut
    where code_statut = "moulu"
    group by rf_id_rdv) as M
    
    on RDV.id_rdv = M.rf_id_rdv
    
    where M.MaxDRdv > ...
    On obtient donc ce genre de requête ... à corriger et compléter si besoin ... car je n'ai pas testé et je fais souvent des fautes
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut Autre solution possible
    Voici une autre approche :
    Vérifier qu'il n'existe pas de statut plus récent que le statut "moulu" pour chaque rendez vous
    Ce qui se traduit comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select RV.id_rdv
         , RV.date_rdv
    from   RDV as RV
    inner join RDV_A_STATUT as RS
       on RS.rf_id_rdv=RV.id_rdv
    inner join STATUT as ST
       on ST.id_statut=RS.rf_id_statut
    where ST.code_statut='moulu'
      and not exists
         (select 1
          from RDV_A_STATUT as RS1
          where RS1.rf_id_rdv=RV.id_rdv
            and RS1.date_rdv_a_statut > RS.date_rdv_a_statut)
    Par curiosité, c'est quoi un rendez-vous "moulu"

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/07/2008, 17h03
  2. Construction d'une requête "imbriquée" avec Oracle
    Par kyra78 dans le forum Langage SQL
    Réponses: 0
    Dernier message: 05/02/2008, 14h29
  3. [MySQL] Erreur SQL 1064 : Requête imbriquée avec jointure !
    Par patchankito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 31/01/2006, 10h37
  4. [DB2] Requête imbriquée avec opérateur IN
    Par JFDelges dans le forum Langage SQL
    Réponses: 23
    Dernier message: 21/12/2005, 11h27
  5. [Débutant] Requête SELECT avec max et sous-requête
    Par joefou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 14h28

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