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 :

Besoin d'aide pour la formulation d'un requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Besoin d'aide pour la formulation d'un requête
    Bonjour,
    Je suis débutant en BDD et j'ai créé ma première base de données aujourdhui.
    Malheuresement je suis en train de tester quelques requêtes sur ma base dans laquelle j'ai transféré quelques données.

    Voici ma base :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    create table UTILISATEUR
    (
        id_utilisateur_u	INTEGER        IDENTITY(1,1)	not null,
        utinfo_u            VARCHAR(7)	              not null,
        nom_u		VARCHAR(30)		not null,
        prenom_u	VARCHAR(30)		not null,
        tel_u		VARCHAR(6)		not null,			
     
        primary key (id_utilisateur_u)
    );
     
    create table PROFIL
    (
        id_profil_p INTEGER          IDENTITY(1,1)	not null,
        intitule_p   VARCHAR(30)			not null,
     
        primary key (id_profil_p)
    );
     
    create table EST_DEFINI_PAR
    (
        id_utilisateur_u	INTEGER        IDENTITY(1,1)	not null,
        id_profil_p	INTEGER		              not null,
     
        primary key (id_utilisateur_u, id_profil_p),
     
        CONSTRAINT  FK_EST_DEFINI_PAR_UTILISATEUR 
        FOREIGN KEY (id_utilisateur_u)	
        REFERENCES  UTILISATEUR(id_utilisateur_u),
     
        CONSTRAINT  FK_EST_DEFINI_PAR_PROFIL
        FOREIGN KEY (id_profil_p)	
        REFERENCES  PROFIL(id_profil_p)
    );
    J'ai donc 3 tables et je souhaite récupérer la liste des utilisateurs qui ont comme profil 'intitule_p'.

    Je ne sais pas sur quelle table faire la requête ni comment faire la jointure. Comme cela me parait difficile, j'ai un doute sur la structure de ma base de données.

    Je ne sais pas si je suis sur la bonne piste ou si je me suis égaré.
    Merci d'avance pour vos réponse,
    Cordialement,
    Antoine

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT UTILISATEUR.utinfo_u, intitule_p FROM UTILISATEUR 
    INNER JOIN EST_DEFINI_PAR ON UTILISATEUR.id_utilisateur_u = EST_DEFINI_PAR.id_utilisateur_u
    INNER JOIN PROFIL ON PROFIL.id_profil_p = EST_DEFINI_PAR.id_profil_p;
    Cette requête à l'air de fonctionner mais cela me parait bien compliqué pour une si simple information.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Ta structure de données correspond au modèle de données suivant (MCD méthode Merise) :
    UTILISATEUR -0,n----EST_DEFINI_PAR----0,n- PROFIL

    Ce modèle signifie que (règle de gestion) :
    Un utilisateur peut être défini par plusieurs profils et un profil peut définir plusieurs utilisateurs.

    je souhaite récupérer la liste des utilisateurs qui ont comme profil 'intitule_p'.
    Je ne sais pas sur quelle table faire la requête
    Tu auras besoin des 3 tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT UTILISATEUR.utinfo_u, intitule_p FROM UTILISATEUR
    INNER JOIN EST_DEFINI_PAR ON UTILISATEUR.id_utilisateur_u = EST_DEFINI_PAR.id_utilisateur_u
    INNER JOIN PROFIL ON PROFIL.id_profil_p = EST_DEFINI_PAR.id_profil_p;
    Ta requête donne la liste de tous les utilisateurs qui ont un profil, avec tous leurs profils.

    Je remettrais quand même en forme cette requête et je la rendrais plus agréable et facile à lire avec l'emploi des alias et en indentant le code pour voir le parcours de la structure de la BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT u.utinfo_u, p.intitule_p
    FROM UTILISATEUR u
    INNER JOIN EST_DEFINI_PAR  e ON u.id_utilisateur_u = e.id_utilisateur_u
    	INNER JOIN PROFIL p ON p.id_profil_p = e.id_profil_p;
    Si tu veux les utilisateurs qui ont un profil particulier, il faut ajouter une condition de restriction (WHERE) à la requête.

    Cette requête à l'air de fonctionner mais cela me parait bien compliqué pour une si simple information.
    Il n'y a pas plus simple pour interroger une association n,n quand on ne connaît pas les identifiants.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Je ne vois pas l'utilité de la table EST_DEFINI_PAR.

    Le champ id_profil_p pourrait être une clé étrangère dans la table UTILISATEUR non ?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par pc75 Voir le message
    Bonjour,

    Je ne vois pas l'utilité de la table EST_DEFINI_PAR.

    Le champ id_profil_p pourrait être une clé étrangère dans la table UTILISATEUR non ?
    Si un utilisateur n'a qu'un profil, oui. S'il peut en avoir plusieurs, non.
    Ici il peut semble t-il en avoir plusieurs.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Justement dans mon MCD, mon modèle de données est :
    UTILISATEUR -0,n----EST_DEFINI_PAR----1,n- PROFIL

    Car un utilisateur à forcement un profil. J'ai surrement fait une erreur dans la transformation de mes entités et associations en relations (tables). J'ai pourtant l'impression d'avoir suivi les règles de conversions.

    J'avais oublié qu'on pouvait faire des alias.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par antoine2641 Voir le message
    Justement dans mon MCD, mon modèle de données est :
    UTILISATEUR -0,n----EST_DEFINI_PAR----1,n- PROFIL
    Ce MCD se traduit par :
    "Un utilisateur peut être défini par plusieurs profils et un profil défini de un à plusieurs utilisateurs."

    C'est différent de :
    Car un utilisateur à forcement un profil.
    Il faudrait plutôt inverser les cardinalités :
    UTILISATEUR -1,n----EST_DEFINI_PAR----0,n- PROFIL

    => Un utilisateur est défini par un à plusieurs profils et un profil peut définir plusieurs utilisateurs.

    J'ai surrement fait une erreur dans la transformation de mes entités et associations en relations (tables).
    Non car avec des cardinalités maximales à n des deux côtés de l'association, la structure des tables sera toujours la même, c'est à dire la vôtre.

    La cardinalité minimale à 1 entraînera, en toute rigueur, un peu de programmation pour assurer que la création d'un utilisateur lui associe aussitôt un profil. S'il y a un profil par défaut, ça peut se faire par un trigger à l'insertion. S'il n'y en a pas, il faudra faire une procédure d'insertion qui prend en entrée les propriétés de l'utilisateur pour alimenter la table UTILISATEUR + la profil pour alimenter la table associative.
    Enfin, il faudra aussi prévoir un trigger ON DELETE pour empêcher de supprimer le dernier profil d'un utilisateur.

    J'ai pourtant l'impression d'avoir suivi les règles de conversions.
    Tu peux lire deux de mes billets de blog :
    1) Sur les règles de gestion et leur transformation en MCD ;
    2) Sur les tables associatives.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    En fait, la question est : Un utilisateur peut-il avoir plusieurs profils ?

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    D'après le MCD d'antoine2641, oui.

    À lui de répondre sur le fond avec la bonne règle de gestion qu'il doit appliquer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Il faudrait plutôt inverser les cardinalités :
    UTILISATEUR -1,n----EST_DEFINI_PAR----0,n- PROFIL
    C'est exact encore un erreur de ma part

    La cardinalité minimale à 1 entraînera, en toute rigueur, un peu de programmation pour assurer que la création d'un utilisateur lui associe aussitôt un profil. S'il y a un profil par défaut, ça peut se faire par un trigger à l'insertion. S'il n'y en a pas, il faudra faire une procédure d'insertion qui prend en entrée les propriétés de l'utilisateur pour alimenter la table UTILISATEUR + la profil pour alimenter la table associative.
    Enfin, il faudra aussi prévoir un trigger ON DELETE pour empêcher de supprimer le dernier profil d'un utilisateur.
    D'accord je pensais qu'il était possible de le définir dans le modèle.
    Quand tu parles de procédure d'insertion, c'est par exemple créer une méthode dans mon programme qui communique avec la BDD, pour s'assurer que chaque utilisateur a un profil. En lancant les requêtes d'insertion nécessaire pour respecter mon MCD. C'est bien sa ?

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    En fait, la question est : Un utilisateur peut-il avoir plusieurs profils ?
    Oui de 1 à n

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Donc ton MCD, corrigé par l'inversion des cardinalités, est bon, ainsi que la requête.

    ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Besoin d'aide pour une formule excel.
    Par passio dans le forum Excel
    Réponses: 9
    Dernier message: 31/01/2012, 01h35
  2. Besoin d'aide pour une formule récalcitrante
    Par houdy dans le forum Excel
    Réponses: 2
    Dernier message: 01/01/2011, 11h35
  3. [OpenOffice][Tableur] Besoin d'aide pour une formule: colorer fond cellule suivant un chiffre
    Par bennji dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 26/01/2009, 13h47
  4. Encore un noob qui a besoin d'aide pour les formules
    Par efk pharos dans le forum Formules
    Réponses: 5
    Dernier message: 17/01/2007, 01h46

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