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 SQL difficile à écrire pour moi


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Par défaut Requête SQL difficile à écrire pour moi
    Bonjour,
    Je plante grave pour l’écriture d'une requête SQL pour MySql.
    Je suis en train d’écrire une application de gestion de planning médical.
    Je dispose de 2 tables :
    • 1 table med comprenant les champs ID, NOM, PRENOM, TEL, MAIL ;
    • 1 table planning comprenant les champs ID, DATE (suite de dates deja générées), ID_MED1 (ID du medecin de garde jour), ID_med2 ID du medecin no 2) , ID_MED3, etc. ;


    ID_MED1 est une clé étrangère.
    Je veux lister via la requête cherchée la forme suivante
    DATE              MED1     MED2    MED3 
    01/01/2018        DUPONT   TOTO    DURAND
    J'arrive avec le début de requête suivant, mais impossible d’éditer MED2 et MED 3.
    Faut-il créer une sous-requête ?

    Ci-dessous mon ébauche de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT planning.DATE, planning.ID_MED1, planning.ID_MED2, med.ID, med.MED_NOM AS MED1
    FROM planning, med
    WHERE planning.ID_MED1= med.ID, planning.ID_MED2=med.ID
    Merci de votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 042
    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 : 22 042
    Billets dans le blog
    6
    Par défaut
    Votre base est très mal modélisée...
    Passons sur le fait que TEL et MAIL ne devrait pas être dans la table med (je suppose que ce sont les médecins).
    Mais en aucun cas vous ne devez avoir dans la table planning ID_MED1, ID_MED2, etc.
    Vous devez avoir une 3e table dit de "jointure" (table associative) entre planning et medecin. Appelons là PLAN_MED, et sa clef primaire doit être constitué des deux clefs primaires de med et planning.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE PLAN_MED(ID_MED..., ID_PLAN...)
    Votre requêtes deviendrons simples et efficaces.


    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/ * * * * *

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Par défaut
    Bonsoir,

    Merci pour votre aide.
    J'ai compris qu'il faut créer une table de jointure constituée des champs, ID,ID_MED, ID_PLANNING.

    Néanmoins,ensuite, quelle forme doit avoir la requête me permettant d'obtenir le résultat demandé ?

    Grand merci pour votre aide.

    A+

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 778
    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 778
    Billets dans le blog
    10
    Par défaut
    Ca dépend. Quel résultat souhaitez-vous obtenir fonctionnellement : liste des médecins de garde de telle à telle date, liste des dates à laquelle tel médecin est de garde...?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Ca dépend. Quel résultat souhaitez-vous obtenir fonctionnellement : liste des médecins de garde de telle à telle date, liste des dates à laquelle tel médecin est de garde...?
    Bonjour

    Merci pour votre réponse

    Avant tout, je veux obtenir une liste de médecins de garde par date (en premiere colonne)

    Mais aussi, c’était le travail que je voulais réaliser plus tard , la liste des dates pour lequel un médecin donné est de garde

    Merci beaucoup

    PS: En attendant de trouver comment creer une table de jointure, j'ai créé cela:

    SELECT
    planning.DATE,m1.MED_NOM as MED1, m2.MED_NOM AS MED2, m3.MED_NOM as MED3
    FROM planning
    INNER JOIN med AS m1 ON m1.ID= planning.ID_MED1
    INNER JOIN med AS m2 ON m2.ID= planning.ID_MED2
    INNER JOIN med AS m3 ON m3.ID= planning.ID_MED3

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 778
    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 778
    Billets dans le blog
    10
    Par défaut
    Créez les tables suivantes (en gras souligné : les PK)

    MEDECIN_ME(ME_id, ME_nom, ME_prenom...)
    GARDE_GA(GA_id, GA_dthdeb, GA_dthfin, ...)
    EFFECTUER_EF(GA_id, ME_id) <== table des liens entre médecins et périodes de garde
    MEDIA_MD(ME_id, MD_id, MD_numero, ..., YM_id FK) <== table de stockage des n° téléphone et autres média, identifiée relativement au médecin (PK = id médecin + id média)
    TYPE_MEDIA_YM(YM_id, YM_code, YM_libelle) <== table des types de média (tél portable pro, portable privé, fax, fixe domicile, fixepro etc...)

    La requête qui permet de connaitre toutes les gardes d'un médecin ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select ME.ME_nom
         , ME.ME_prenom
         , GA.GA_dthdeb
         , GA.GA_dthfin
    from MEDECIN_ME as ME
    inner join EFFECTUER_EF as EF
       on EF.ME_id=ME.ME_id
    inner join GARDE_GA
       on GA.GA_id=EF.GA_id
    order by GA.GA_dthdeb asc

    La requête qui liste tous les médecins de garde par date ressemble à ceci :

    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
    17
    18
    select GA.GA_dthdeb   as deb_astreinte
         , GA.GA_dthfin   as fin_astreinte
         , ME.ME_nom      as nom_medecin
         , ME.ME_prenom   as prn_medecin   
         , MD.MD_numero   as portable_astreinte
    from GARDE_GA as GA
    inner join EFFECTUER_EF as EF
       on EF.GA_id=GA.GA_id
    inner join MEDECIN_ME as ME
       on ME.ME_id=EF.ME_id
    left join MEDIA_MD as MD -- jointure outer pour rechercher le portable d'astreinte
         inner join TYPE_MEDIA_YM as YM
            on YM.YM_id   = MD.YM_id
           and YM.YM_code = 'POAS' -- type portable d'astreinte
       on MD.ME_id=EF.ME_id
    where date(GA.GA_dthdeb) between '2018-10-01' and '2018-10-31'
    order by GA.GA_dthdeb asc
           , ME.ME_nom asc

Discussions similaires

  1. requête un peu complexe pour moi (delete + distinct + max)
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/08/2008, 12h38
  2. [Requête SQL]Trop longue pour une ligne
    Par jbulysse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/07/2008, 14h27
  3. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 14h50
  4. Quelle requête dois-je écrire pour obtenir cette liste ?
    Par boufon dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/07/2007, 02h12
  5. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 22h52

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