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 :

problème d'utilisation du JOIN et du WHERE


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut problème d'utilisation du JOIN et du WHERE
    Bonjour,
    J’ai un petit pb avec une requête… qui fonctionne presque !
    Le but :
    je cherche à avoir une liste d’assistantes avec le nom de leur responsable dans la même requête. L’assistante et le responsable ont la même entité (délégation).
    Les tables :
    - users (user_id ; user_nom ; user_prenom) : elle contient tous les utilisateurs (donc les assistantes + les responsables)
    - entités (ent_id ; label) : elle contient toutes les entités (délégations)
    - rel_users_entites (user_id ; ent_id ; flag_responsable ; flag_assistant) : elle fait la relation entre les 2 tables précédentes et indique si le user est responsable ou non, assistante ou non d’une entité donnée.
    Le contexte :
    je ne peux utiliser que MySQL 4.0.23 ce qui m’empêche de faire des requêtes imbriquées.
    La requête :
    J’obtiens quasiment ce que je désire… le seul problème est que je n’ai pas toutes les assistantes car celles qui n’ont pas encore de « responsable » pour une entité donnée, n’apparaissent pas. En effet, mon « where rue.ent_id = r.ent_id » me sélectionne que les lignes correspondantes, à droite et à gauche... et je n’arrive pas à inclure cette ligne dans un des JOIN précédents (ou un nouveau) sans lever une erreur ou avoir un résultat ne correspondant pas à ce que je désire…

    SELECT u.user_nom as 'NOM ASSISTANTE',
    u.user_prenom as 'PRENOM ASSISTANTE',
    u.user_email as 'MAIL ASSISTANTE',
    r.etage as ETAGE,
    u.telephone as TELEPHONE,
    us.user_nom as 'NOM DU RESPONSABLE',
    us.user_prenom as 'PRENOM DU RESPONSABLE'

    FROM entites e,
    sites s,
    rel_users_entites AS r
    LEFT OUTER JOIN users AS u
    ON (r.user_id = u.user_id
    AND r.flag_assistant = 'O'),
    rel_users_entites AS rue
    LEFT OUTER JOIN users AS us
    ON (rue.user_id = us.user_id
    AND rue.flag_responsable = 'O')

    WHERE rue.ent_id = r.ent_id
    AND r.ent_id = e.ent_id
    AND e.site_id = s.site_id

    GROUP BY
    u.user_nom, us.user_nom

    Si vous avez le temps et réussi à comprendre mon problème, merci d’avance de votre aide !

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Peux-tu ré-écrire ta requête en n'utilisant que la syntaxe normée pour les jointure (INNER JOIN), en indentant, en utilisant les balises [Code]
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: problème d'utilisation du JOIN et du WHERE
    Au niveau de la jointure, ça donne ça:

    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
    SELECT
      assistante.user_nom AS 'NOM ASSISTANTE', 
      assistante.user_prenom as 'PRENOM ASSISTANTE', 
      assistante.user_email as 'MAIL ASSISTANTE', 
      assistante.telephone as 'TELEPHONE ASSISTANTE', 
     
      responsable.user_nom as 'NOM DU RESPONSABLE', 
      responsable.user_prenom as 'PRENOM DU RESPONSABLE' 
     
    FROM users AS assistante
    INNER JOIN rel_users_entites AS rel_1 ON (assistante.user_id = rel_1.user_id)
     
    LEFT OUTER JOIN rel_users_entites AS rel_2 ON (rel_1.ent_id=rel_2.ent_id)
     
    INNER JOIN users AS responsable
    ON (responsable.user_id = rel_2.user_id) 
     
    WHERE rel_1.flag_assistant = 'O'
    AND rel_2.flag_responsable = 'O'
    Quelques trucs que je ne pige pas: le numéro de l'étage se trouve dans quel table? Qu'est-ce qu'on a dans la table site? A quoi te sert le GROUP BY?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses, je suis en train de tester mais ça prend pas mal de temps.

    Voici ma requête actuellement en test :

    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
    SELECT          
    assistante.user_nom         as 'NOM ASSISTANTE',
    assistante.user_prenom    as 'PRENOM ASSISTANTE',
    assistante.user_email       as 'MAIL ASSISTANTE',
    rel_1.etage                      as ETAGE,
    assistante.telephone         as TELEPHONE,
    responsable.user_nom      as 'NOM DU RESPONSABLE',
    responsable.user_prenom as 'PRENOM DU RESPONSABLE'
     
    FROM   
    entites e,
    tmp_organigramme_plat p,
    sites s,
    statut st,
    users AS assistante
       INNER JOIN rel_users_entites AS rel_1 ON  (assistante.user_id = rel_1.user_id)
       LEFT OUTER JOIN rel_users_entites AS rel_2 ON (rel_1.ent_id=rel_2.ent_id) 
       INNER JOIN users AS responsable 
     
    WHERE 
           rel_1.flag_assistant = 'O' 
    AND rel_2.flag_responsable = 'O'
    AND  e.site_id          = s.site_id
    AND  u.user_id          = p.user_id
    AND  e.ent_id           = p.ent_id
    AND  s.nom_site         = 'toto'
     
    GROUP BY
    assistante.user_nom, responsable.user_nom
    Le numéro d'étage se trouve dans rel_users_entites (mais ça n'est pas très important).
    Dans la table site, il y a le nom du site (entre autres) sur lequel je désire effectuer ma recherche d'assistantes et de responsables.
    Le group by me sert à regrouper les assistantes : il peut en effet y avoir plusieurs responsables par assistantes et inversement.

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par GphyProg
    Merci pour vos réponses, je suis en train de tester mais ça prend pas mal de temps.
    Oui, c'est normal que ça prenne beaucoup de temps, quand tu fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    FROM
      entites e,
      tmp_organigramme_plat p,
      sites s,
      statut st,
      users AS assistante
    ... tu fais un produit cartésien, c'est à dire que ça ferra toutes les combinaisons possibles entre les enregistrements des tables entites, tmp_organigramme_plat, sites, statut et users !!!!

    Oublie les jointures dites "simples" (avec la condition de jointure dans le WHERE) et utilise des jointures INNER JOIN à la place !

    A mon avis, c'est plus un ORDER BY qu'il te faut plutôt qu'un GROUP BY.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: problème d'utilisation du JOIN et du WHERE
    Je reprends en ajoutant les autres tables:

    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
    SELECT
      assistante.user_nom     AS 'NOM ASSISTANTE', 
      assistante.user_prenom  AS 'PRENOM ASSISTANTE', 
      assistante.user_email   AS 'MAIL ASSISTANTE',
      rel_1.etage             AS 'ETAGE',
      assistante.telephone    AS 'TELEPHONE ASSISTANTE', 
      responsable.user_nom    AS 'NOM DU RESPONSABLE', 
      responsable.user_prenom AS 'PRENOM DU RESPONSABLE' 
     
    FROM users AS assistante
     
    INNER JOIN rel_users_entites AS rel_1
    ON (assistante.user_id = rel_1.user_id)
     
    LEFT OUTER JOIN rel_users_entites AS rel_2
    ON (rel_1.ent_id=rel_2.ent_id)
     
    INNER JOIN users AS responsable
    ON (responsable.user_id = rel_2.user_id)
     
    INNER JOIN entites
    ON (entites.ent_id=rel_1.ent_id)
     
    INNER JOIN sites
    ON (entites.site_id=sites.site_id)
     
    WHERE rel_1.flag_assistant = 'O'
    AND rel_2.flag_responsable = 'O'
    AND sites.nom_site= 'toto'
     
    GROUP BY assistante.user_nom, responsable.user_nom
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé mais toutes les assistantes n'apparaissent pas... seules celles qui ont un responsable.
    Mais je vais arrêter là pour l'instant, ça n'est pas urgent.
    Merci de votre aide !

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Et comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    WHERE rel_1.flag_assistant = 'O'
    AND (rel_2.flag_responsable = 'O' OR rel_2.flag_responsable IS NULL)
    AND sites.nom_site= 'toto'
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour, désolé pour cette absence prolongée...
    je viens de tester :
    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
    SELECT 
      assistante.user_nom     AS 'NOM ASSISTANTE', 
      assistante.user_prenom  AS 'PRENOM ASSISTANTE', 
      assistante.user_email   AS 'MAIL ASSISTANTE', 
      rel_1.etage             AS 'ETAGE', 
      assistante.telephone    AS 'TELEPHONE ASSISTANTE', 
      responsable.user_nom    AS 'NOM DU RESPONSABLE', 
      responsable.user_prenom AS 'PRENOM DU RESPONSABLE' 
     
    FROM users AS assistante 
     
    INNER JOIN rel_users_entites AS rel_1 
    ON (assistante.user_id = rel_1.user_id) 
     
    LEFT OUTER JOIN rel_users_entites AS rel_2 
    ON (rel_1.ent_id=rel_2.ent_id) 
     
    INNER JOIN users AS responsable 
    ON (responsable.user_id = rel_2.user_id) 
     
    INNER JOIN entites 
    ON (entites.ent_id=rel_1.ent_id) 
     
    INNER JOIN sites 
    ON (entites.site_id=sites.site_id) 
     
    WHERE rel_1.flag_assistant = 'O' 
    AND (rel_2.flag_responsable = 'O' 
    OR rel_2.flag_responsable IS NULL)           
    AND  sites.nom_site         = 'toto'
     
    GROUP BY assistante.user_nom, responsable.user_nom
    mais je n'ai toujours que mes assistantes qui ont un responsable.
    J'ai réglé le problème "à la main" donc je n'ai plus besoin de cette requête !
    mais si vous avez une idée... n'hésitez pas !
    a+

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 73
    Points : 24
    Points
    24
    Par défaut
    JE pense que c'est un probleme du meme style que j'ai mais moi cela ne lit meme pas bien voir pas du tout je comprend pas

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par ept35
    JE pense que c'est un probleme du meme style que j'ai mais moi cela ne lit meme pas bien voir pas du tout je comprend pas
    Non, ça n'a rien à voir: ici on a une jointure réflexive avec du LEFT OUTER JOIN au milieu, donc c'est un peu plus compliqué !

    A l'occasion, faudra que je regarde ça d'un peu plus près et que je fasse les requêtes chez moi...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  12. #12
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    J'ai testé cette requête, qui a l'air de marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT assistant.*, responsable.*
    FROM user assistant
     
    INNER JOIN rel_users_entites rel1
    ON (rel1.user_id = assistant.user_id)
     
    LEFT OUTER JOIN rel_users_entites rel2
    ON (rel1.ent_id = rel2.ent_id AND rel2.flag_responsable='O' )
     
    LEFT OUTER JOIN user responsable
    ON (rel2.user_id = responsable.user_id)
     
    WHERE rel1.flag_assistant='O'
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. Problème de join ou de where :/
    Par yoyo88 dans le forum Linq
    Réponses: 3
    Dernier message: 07/10/2010, 11h31
  2. utiliser inner join au lieu de where
    Par Jcpan dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/09/2009, 14h07
  3. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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