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 :

Deux requêtes dans une


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut Deux requêtes dans une
    Bonjour,

    Je suis débutant en SQL et je chercherais un coups de pouce sur une requête particulière. J'ai du mal à expliquer mon problème simplement alors j'ai fait une image:



    Et ma requête pour est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT        hot.name, hot.first_name, esta.establishment_id, esc.group_establishment, blish.label, esc.collectivite_id
    FROM            imghotline.hotline_user AS hot INNER JOIN
                             imghotline.establishment_user AS esta ON hot.hotline_user_id = esta.hotline_user_id INNER JOIN
                             imghotline.establish AS esc ON esta.establishment_id = esc.establishment_id INNER JOIN
                             imghotline.establishment AS blish ON blish.establishment_id = esta.establishment_id
    ORDER BY hot.name

    Il faudrait que le label (nom de poste) affiché ne soit pas celui de l'utilisateur en cours mais celui de son groupe (en gros si il est "développeur", ça affiche "système informatique").
    Il faudrait faire comme une deuxième requête dans ma requête, mais je trouve pas comment faire. J'ai trouver des jointures right et left, mais je ne sais pas si c'est tellement ça...

    Auriez-vous une piste?


    EDIT:
    Pour avoir une idée de la tête des tables (j'ai enlevé ce qui ne sert pas).
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Bonjour,
    Où se trouve le label du groupe (quelle colonne de quelle table) ?

    Tatayo.

  3. #3
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Où se trouve le label du groupe (quelle colonne de quelle table) ?

    Tatayo.
    L'id du poste de Xavier par exemple est le 256 et son groupe c'est 89 et 89 c'est l'establishment_id correspondant. C'est incompréhensible hein ?!

    En gros Xavier son poste est le numéro 256 (donc bureau d'étude) et son service est le numéro 89 (Techniques Ville). Que ça soit 256 ou 89, ce sont tous les deux des id qui correspondent à la même table et même colonne. Mais au lieu qu'il me donne le label de son poste, je voudrais qu'il me dise : là, il y a un numéro de groupe, donc je prends ce numéro et j'affiche le label de ce numéro.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    C'est bien, mais:
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Où se trouve le label du groupe (quelle colonne de quelle table) ?

    Tatayo.
    Parce que savoir que l'utilisateur 256 est dans le groupe 89, ça ne nous dit pas comment retrouver le groupe d'un utilisateur.

    Tatayo.

  5. #5
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Table imghotline.establishment
    Colonne label

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Je ne comprends toujours pas comment retrouver le groupe d'un utilisateur à partir de son Id.

  7. #7
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Je ne comprends toujours pas comment retrouver le groupe d'un utilisateur à partir de son Id.
    Xavier, son establishment_id est 256 et son groupe 86.
    Quand on a un numéro dans groupe, ça correspond à un numéro d'establishment_id (celui de son parent).
    Le label que j'affiche déjà, je le garde mais au lieu d'afficher le label id 256, je veux le label id 86.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Je vais essayer autrement...
    Montre nous la requête qui permet, à partir d'un id utilisateur, de retrouver l'id du groupe auquel il appartient.
    Mieux encore: donne nous un jeu d'essai, avec quelques lignes de chaque table, et le résultat attendu.

    Tatayo.

  9. #9
    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
    c'est vrai que tout ça n'est pas clair.

    Je dirais qu'il faut effectivement faire une jointure externe gauche (LEFT OUTER JOIN) afin d'obtenir le nom du groupe s'il existe (et garder la ligne si pas de groupe) et prendre la première colonne non nulle, avec COALESCE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT        hot.name, hot.first_name, esta.establishment_id, esc.group_establishment, COALESCE(groupe.label, blish.label) as label, esc.collectivite_id
    FROM            imghotline.hotline_user AS hot INNER JOIN
                             imghotline.establishment_user AS esta ON hot.hotline_user_id = esta.hotline_user_id INNER JOIN
                             imghotline.establish AS esc ON esta.establishment_id = esc.establishment_id INNER JOIN
                             imghotline.establishment AS blish ON blish.establishment_id = esta.establishment_id
    LEFT JOIN imghotline.establish AS groupe ON groupe.establishment_id = blish.group_establishment
    ORDER BY hot.name

  10. #10
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Montre nous la requête qui permet, à partir d'un id utilisateur, de retrouver l'id du groupe auquel il appartient.

    Pour avoir l'id du groupe il faut prendre avant tout l'id de son "poste".
    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT        esta_us.hotline_user_id, esta_us.establishment_id, establish.group_establishment
    FROM            imghotline.establishment_user AS esta_us INNER JOIN
                             imghotline.establish AS establish ON esta_us.establishment_id = establish.establishment_id
    ORDER BY esta_us.establishment_id

    Et le résultat:



    Citation Envoyé par tatayo Voir le message
    Mieux encore: donne nous un jeu d'essai, avec quelques lignes de chaque table






    Citation Envoyé par tatayo Voir le message
    et le résultat attendu.
    Le résultat attendu c'est la première image postée, sauf qu'au lieu que ça soit le label de l'establishment id de l'utilisateur, c'est le label de l'establishment_id qui ressort du group_establishment.


    Citation Envoyé par aieeeuuuuu Voir le message
    Je dirais qu'il faut effectivement faire une jointure externe gauche (LEFT OUTER JOIN) afin d'obtenir le nom du groupe s'il existe (et garder la ligne si pas de groupe) et prendre la première colonne non nulle, avec COALESCE

    Je regarde sur le net comment fonctionne COALESCE (que je ne connais pas) et je reviens vous donner des news.


    En tout cas un grand merci de votre aide, c'est vraiment pas clair et vous prenez quand même le temps d’essayer de m'aider. Merci
    Images attachées Images attachées     

  11. #11
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    COALESCE:
    Évalue les arguments dans l'ordre et retourne la valeur actuelle de la première expression qui ne prend pas initialement la valeur NULL.

    Le group_establishment n'est jamais nul mais prend la valeur 0 quand l'establishment_id est déjà le numéro de service.

  12. #12
    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 kratoce Voir le message
    Le group_establishment n'est jamais nul mais prend la valeur 0 quand l'establishment_id est déjà le numéro de service.
    Quel est le libellé de "l'etablishement" ayant l'id 0 ? avez vous bien une contrainte d'intégrité définie ?

    Vous pouvez ajouter une clause dans la jointure externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LEFT JOIN imghotline.establish AS groupe 
        ON groupe.establishment_id = blish.group_establishment
        AND blish.establishment_id <> 0

  13. #13
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Quel est le libelle de "l'etablishement" ayant l'id 0 ?
    Il n'y a pas d'id à 0. Je vais essayer d'illustrer tout ça.
    Voici un organigramme.


    JP Fouillet travaille dans le service Achat-Mécanique (establishment_id 243) et dans le secteur Techniques Ville (establishment_id 89).
    Quand je fait ma requête, je vois que son establishment_id est 243 et son group_id est 89 et ça m'affiche le label de l'establishment_id 243.
    Au lieu d'afficher le label de son service (le label du 243), je voudrais le label de son groupe (89).
    Le group_id sert juste à dire: si tu cherches le supérieur de ce service, c'est le numéro ... Si c'est 0, c'est qu'il n'y a pas de chef (Comme pour David dans le service Technique Ville directement)
    Images attachées Images attachées  

  14. #14
    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 kratoce Voir le message
    Il n'y a pas d'id à 0.
    C'est ce que je pensais. Vous n'avez donc pas d'intégrité référentielle déclarée sur cette clef étrangère group_id.
    C'est mal
    Pourquoi ne pas laisser à NULL plutôt que 0 ?

  15. #15
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Pourquoi ne pas laisser à NULL plutôt que 0 ?
    Je suis juste un apprenti qui arrive dans un base déjà toute faite et à qui on demande de faire ça

    Je peux leur dire que la façon dont ils ont fait leur base c'est mal, mais ils risquent de ne pas forcément apprécier

  16. #16
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Citation Envoyé par kratoce Voir le message
    Je peux leur dire que la façon dont ils ont fait leur base c'est mal, mais ils risquent de ne pas forcément apprécier
    Tout est une question de présentation... Si vous arrivez en leur disant qu'ils ont modélisé leur base de données comme des quiches (certes, ce n'est pas faux !), là effectivement, ça pourrait mal se passer
    En revanche, dans le cadre du travail qu'on vous a demandé, vous pouvez proposer une amélioration de la structure de la base qui vous permettrait de le résoudre bien plus facilement...

  17. #17
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    Je vais y réfléchir ...

    Donc aucune solution possible ?

  18. #18
    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 kratoce Voir le message
    Donc aucune solution possible ?
    Si, je vous l'ai déjà donnée :

    Citation Envoyé par aieeeuuuuu Voir le message
    Vous pouvez ajouter une clause dans la jointure externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LEFT JOIN imghotline.establish AS groupe 
        ON groupe.establishment_id = blish.group_establishment
        AND blish.establishment_id <> 0

  19. #19
    Membre actif Avatar de kratoce
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2012
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2012
    Messages : 270
    Points : 238
    Points
    238
    Par défaut
    J'ai dû mal suivre...

    La requête final donne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT        hot.name, hot.first_name, esta.establishment_id, esc.group_establishment, groupe.label, esc.collectivite_id
    FROM            imghotline.hotline_user AS hot INNER JOIN
                             imghotline.establishment_user AS esta ON hot.hotline_user_id = esta.hotline_user_id INNER JOIN
                             imghotline.establish AS esc ON esta.establishment_id = esc.establishment_id INNER JOIN
                             imghotline.establishment AS blish ON blish.establishment_id = esta.establishment_id LEFT OUTER JOIN
                             imghotline.establish AS groupe ON groupe.establishment_id = groupe.group_establishment AND blish.establishment_id <> 0
    ORDER BY hot.name
    Mais ça ne me donne que des valeurs nulles dans label. Où me suis-je trompé ?

  20. #20
    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 kratoce Voir le message
    J'ai dû mal suivre...
    Mais ça ne me donne que des valeurs nulles dans label. Où me suis-je trompé ?
    Dans la jointure !
    Votre condition porte sur la même table :

    remplacez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LEFT OUTER JOIN imghotline.establish AS groupe 
    ON groupe.establishment_id = groupe.group_establishment 
    AND blish.establishment_id <> 0
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LEFT OUTER JOIN imghotline.establish AS groupe 
    ON groupe.establishment_id = blish.group_establishment 
    AND blish.establishment_id <> 0

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Deux requêtes dans une même page
    Par Trezegoals dans le forum Doctrine2
    Réponses: 0
    Dernier message: 15/04/2013, 09h18
  2. Deux requêtes dans une seule requête, est-ce possible ?
    Par Stephane_br dans le forum Développement
    Réponses: 3
    Dernier message: 08/07/2011, 15h35
  3. [MySQL] Deux requêtes dans une boucle
    Par stefanelle dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/02/2009, 10h41
  4. [VB6] Comparaison de deux dates dans une requête
    Par paradeofphp dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/06/2006, 19h45
  5. Additionner deux champs dans une requête
    Par eddyG dans le forum Access
    Réponses: 5
    Dernier message: 30/05/2006, 18h00

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