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

PHP & Base de données Discussion :

trouver le nom du manager de l'utilisateur [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut trouver le nom du manager de l'utilisateur
    Bonjour,

    j'ai 2 tables :
    USL_user_license qui contient les propriétaires de licence :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE USL_user_license(
       US_ident INT UNSIGNED,
       US_ident_manager INT UNSIGNED NOT NULL,
       COU_ident INT UNSIGNED,
       LO_ident INT UNSIGNED,
       CO_ident INT UNSIGNED NOT NULL,
       PRIMARY KEY(US_ident),
       FOREIGN KEY(US_ident) REFERENCES US_user(US_ident),
       FOREIGN KEY(US_ident_manager) REFERENCES US_user(US_ident),
       FOREIGN KEY(COU_ident, LO_ident) REFERENCES LO_location(COU_ident, LO_ident),
       FOREIGN KEY(CO_ident) REFERENCES CO_company(CO_ident)
    );

    et une seconde table US_user qui contient tous les utilisateurs (donc les propriétaires de licence et leur manager) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE US_user(
       US_ident INT UNSIGNED AUTO_INCREMENT,
       US_sesa INT,
       US_firstname VARCHAR(50),
       US_lastname VARCHAR(50),
       PRIMARY KEY(US_ident),
       UNIQUE(US_sesa)
    );
    La première table possède 2 clés étrangères vers la seconde ; l'une concerne la colonne US_ident (elle désigne un propriétaire de licence) et l'autre concerne la colonne US_ident_manager (elle désigne le manager d'un propriétaire de licence).

    Mon souhait est de trouver la requête qui donnera nom et prénom du manager d'un propriétaire de licence, désigné par son identifiant (nommé code SESA).

    J'ai fait cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT US.US_firstname, US.US_lastname FROM US_user US 
    JOIN USL_user_license USL ON USL.US_ident_manager = US.US_ident
    WHERE US.US_sesa=100008
    mais elle ne retourne rien alors que l'utilisateur dont le SESA est 100008 existe dans la table US_user. Pourquoi ?

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    et l'autre concerne la colonne US_ident_manager (elle désigne le manager d'un propriétaire de licence).
    Un même utilisateur peut avoir différents managers selon les licences attribués ?

    mais elle ne retourne rien alors que l'utilisateur dont le SESA est 100008 existe dans la table US_user. Pourquoi ?
    Parce que tu fais une jointure sur le manager ( ON USL.US_ident_manager = US.US_ident )
    Tu sautes l'étapes de récupération des données du propriétaire de licence, du coup ton WHERE tape dans le vide

    Cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = <<<SQL
        SELECT ALL managers.*
        FROM US_user AS US
        INNER JOIN USL_user_license AS USL ON USL.US_ident = US.US_ident -- On cherche les licences de l'utilisateur
        INNER JOIN US_user AS managers ON  US_ident_manager = managers.US_ident -- On cherches les managers
        WHERE US.US_sesa = {$sesa}
        SQL;

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut

    j'ai bien fait de poster car ta solution fonctionne
    Il faudra que je l'étudie à tête reposée car j'ai du mal à comprendre...Je pars en vacances demain pour environ 2 semaines (sans le PC), donc on verra au retour...

    Citation Envoyé par Séb. Voir le message
    Un même utilisateur peut avoir différents managers selon les licences attribués ?
    Un utilisateur peut posséder plusieurs licences mais il a un seul manager. D'ailleurs dans la table USL_user_license, il y a une seule colonne US_ident_manager, donc pour un utilisateur (identifié par la colonne US_ident), un seul manager (identifié par la colonne US_ident_manager). Qu'est-ce qui te fait poser cette question ?

    EDIT : j'ai un peu modifié ta requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT managers.US_firstname,managers.US_lastname
        FROM US_user AS US
        INNER JOIN USL_user_license AS USL ON USL.US_ident = US.US_ident -- On cherche les licences de l'utilisateur
        INNER JOIN US_user AS managers ON  US_ident_manager = managers.US_ident -- On cherches les managers
        WHERE US.US_sesa = 100008
    Ca donne le même résultat. Quel est le rôle de ALL devant SELECT ?

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Un utilisateur peut posséder plusieurs licences mais il a un seul manager. D'ailleurs dans la table USL_user_license, il y a une seule colonne US_ident_manager, donc pour un utilisateur (identifié par la colonne US_ident), un seul manager (identifié par la colonne US_ident_manager). Qu'est-ce qui te fait poser cette question ?
    Avec ton modèle tu as autant de managers (potentiellement différents) que de licences.
    Si un utilisateur a 1 et 1 seul manager alors il faut stocker l'info dans la table des utilisateurs, et pas des licences.

    Tu auras une table qui s'auto-référencera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    users
    -----------
    user_id
    user_fullname
    user_role
    ...
    user_manager # Clef étrangère sur users.user_id
    Ainsi si ton user change de manager tu auras 1 seul champ à modifier, et 1 seule jointure à faire pour récupérer les users et leurs managers :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ALL u.user_fullname AS user_fullname, m.user_fullname AS manager_fullname
    FROM users AS u
    INNER JOIN users AS m ON u.user_manager= m.user_id

    Ca donne le même résultat. Quel est le rôle de ALL devant SELECT ?
    ALL est la valeur par défaut du SELECT, opposée au DISTINCT. Je n'aime pas les valeurs par défaut qu'on oublie, alors j'ai pris l'habitude de le spécifier systématiquement

    Bonnes vacs,

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Je pars que cet après-midi

    Pas possible d'ajouter une colonne Manager à la table US_user car tous les utilisateurs n'ont pas de manager (ou plutôt, on ne le connait pas).

    Voici mon modèle complet :
    Nom : mcdx5500.png
Affichages : 75
Taille : 1,10 Mo
    On ne connaît pas le manager des utilisateurs qui ont créé un ticket (les tickets servent à signaler un bug sur une application)

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Pas possible d'ajouter une colonne Manager à la table US_user car tous les utilisateurs n'ont pas de manager (ou plutôt, on ne le connait pas).
    Dans ce cas users.user_manager sera NULL. C'est une valeur acceptable pour une clef étrangère, et permet de savoir facilement quels sont les users sans manager (et surtout de ne pas avoir à gérer la cohérence des managers) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ALL ...
    FROM users
    WHERE user_manager IS NULL

    Même requête avec ton modèle :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ALL ...
    FROM users
    LEFT OUTER JOIN licences ON user_id = licence_user
    WHERE licence_manager IS NULL

    C'est quand même moins parlant

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

Discussions similaires

  1. [WS 2012 R2] Impossible de trouver le nom d'utilisateur
    Par azaouali dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 11/03/2021, 12h13
  2. Réponses: 0
    Dernier message: 29/01/2009, 10h43
  3. [MySQL] Trouver le nom de l'utilisateur qui se connecte(debutant)
    Par Natsume dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/10/2006, 13h19
  4. trouver le nom de la table associée à un trigger
    Par ndufour dans le forum Développement
    Réponses: 2
    Dernier message: 09/02/2006, 16h25
  5. Trouver le nom de la DLL en cours d'execution
    Par jean31a dans le forum Langage
    Réponses: 10
    Dernier message: 10/05/2005, 09h26

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