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 :

Inner join sur une meme table?


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut Inner join sur une meme table?
    Bonjour,

    Je demande votre aide car je suis bloqué, je ne sais as faire...
    Je dispose d'une table 'users' comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE users
    (
        id_users INT PRIMARY KEY AUTO_INCREMENT,
        firstname VARCHAR(100),
        lastname VARCHAR(100),
        login VARCHAR(255),
        email VARCHAR(100),
        password VARCHAR(255),
        manager INT,
        id_role INT,
        first_connex INT
    );

    Nom : Capture users.PNG
Affichages : 416
Taille : 4,9 Ko

    La colonne manager correspond à un id_users. Quand je créer un utilisateur, je dois lui attribué un manager, et je stock donc dans manager la valeur de id_users du manager.
    Je cherche à faire un "select firstname, lastname, manager" et je veux que pour "manager" ça m'affiche le "login" du manager et non son "id_users"

    Pour vous donner un exemple, voici ce que j'ai:
    Nom : exemple users.PNG
Affichages : 452
Taille : 31,3 Ko

    voici ce que je veux obtenir avec ma requête:
    Nom : resultat.PNG
Affichages : 419
Taille : 2,4 Ko

    En vous remerciant.

  2. #2
    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
    1) Stocker les mots de passe en clair dans la BDD est une mauvaise idée !
    En plus vos mots de passe sont crackables par un enfant !

    2) Oui, on peut faire une auto-jointure. Avez-vous essayé ?
    Si oui, quelle requête avez-vous essayée ?
    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 !

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut
    Bonjour cinephil!

    1) Vous vous doutez bien que vu les noms présent dans ma BDD je suis en période de tests j'ai besoin que les MDP soient en clair pour les vérifier, car ils sont auto-générer.
    Enfin, cela non ne sont pas auto-générer, mais les nouveaux oui!

    2) Voici un des trucs que j'ai testé, mais je n'ai pas le résultat voulu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT u.lastname, u.firstname, u.manager FROM users
    INNER JOIN users u on u.manager=u.id_users=u.login

  4. #4
    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
    Comme vous utilisez deux fois la même table, il faut donner deux alias différents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT u1.lastname, u1.firstname, u2.login AS login_manager 
    FROM users u1
    INNER JOIN users u2 on u1.manager = u2.id_users
    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 !

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup ça me donne le résultat souhaité!!!

    Je ne savais pas qu'on pouvais donné deux alias différent pour une même table!

    Et quand je vois cette requête je me dis que j'ai été idiot de mettre u.manager au lieu de u.login...

  6. #6
    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
    Les deux utilités des alias sont :
    1) Utiliser deux fois la même table dans la même requête
    2) Simplifier l'écriture des requêtes multi-tables pour ne pas écrire le nom de la table en entier dans toute la requête. Ça simplifie aussi la lecture.
    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 !

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut
    Et bien merci beaucoup je ne connaissais pas!

    Aujourd'hui grâce à toi j'ai appris.

  8. #8
    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
    Encore quelques remarques sur votre table...

    1) Écrivez le nom de vos tables et colonnes au singulier.
    L'usage d'un pluriel peut prêter à confusion et faire penser à une mauvaise conception.
    Votre table user (sans s, donc) est issue de l'entité type user du modèle conceptuel de données (méthode Merise) ou de votre diagramme de classes (langage UML). Ce MCD (le meilleur modèle pour concevoir une base de données) est lui-même issu de règles de gestion de ce type :
    Un user est encadré par un seul manager et un manager peut encadrer plusieurs users.

    Vous voyez que la règle de gestion décrit l'association entre UN user et UN manager au singulier. De plus, chaque ligne de votre table ne contiendra qu'un seul user.

    => table user et colonne id_user

    2) Vos colonnes sont probablement formatées de manière trop grande.
    Je n'aimerais pas porter un nom et un prénom de 100 caractères et je ne me choisirais sûrement pas un login ni un mot de passe aussi long !

    3) Puisque vous allez chiffrer les mots de passe, déterminez la longueur de la colonne à la longueur du chiffrage. Du coup, vous pouvez utiliser le type CHAR plutôt que VARCHAR puisque tous les mots de passe auront la même longueur chiffrée.

    4) N'oubliez pas de programmer vos clés étrangères. Vous en avez ici deux : manager et id_role.
    Ceci est valable bien entendu si votre table n'est pas en MyISAM, ce que j'ose espérer !

    Au passage, j'appellerais la colonne plutôt id_manager.

    5) Éviter l'usage du bonhomme NULL !
    Il nuit aux performances et est sujet à interprétations car il ne veut rien dire en lui-même sinon une absence de valeur.

    6) N'oubliez pas non plus d'indexer votre table... et les autres, évidemment !
    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 !

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut
    Merci pour tous ces conseils!
    C'est vrai que ma base n'est pas très propre, je prends note et je vais tout redimensionner et renommer lorsque je passerais en prod.

    4)Normalement j'ai programmé toute mes clés étrangères, mais je comptes quand même vérifier.

    5) J'ai laissé Null car sinon il aurait fallu que je l'initialise à 0 par défaut et je ne savais pas comment faire...
    D'ailleurs dans une autre table, j'ai une colonne 'commentaire' qui est aussi initialisé à NULL.... et je ne vois pas quoi mettre d'autre car c'est une varchar

    6)Ensuite pour l'index, oui c'est prévu

  10. #10
    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
    J'ai laissé Null car sinon il aurait fallu que je l'initialise à 0 par défaut et je ne savais pas comment faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    first_connex INT NOT NULL DEFAULT 0
    D'ailleurs dans une autre table, j'ai une colonne 'commentaire' qui est aussi initialisé à NULL.... et je ne vois pas quoi mettre d'autre car c'est une varchar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commentaire NOT NULL DEFAULT ''
    À noter que sans précision de la valeur par défaut, MySQL en a une pour chaque type de colonne :
    - 0 pour les colonnes numériques ;
    - '' (chaîne vide) pour les colonnes textuelles ;
    - et l'horrible '0000-00-00' pour les colonnes de date.
    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 !

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut
    Merci!

  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
    J'ai mis à jour mon commentaire précédent, probablement après votre merci.
    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 !

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 88
    Points : 45
    Points
    45
    Par défaut
    Effectivement!

    On ne m'avait jamais appris tout ça, comme quoi il faut pratiquer pour s'améliorer!
    Merci beaucoup

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

Discussions similaires

  1. Deux inner join sur une même table
    Par Pachina75 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2014, 14h54
  2. INNER JOIN sur la meme table
    Par fikovic30 dans le forum Développement
    Réponses: 8
    Dernier message: 08/05/2013, 15h58
  3. Requete avec inner join sur une meme table
    Par mattmax dans le forum Développement
    Réponses: 1
    Dernier message: 15/12/2011, 14h34
  4. deux inner join sur une table
    Par the-player777 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/11/2007, 09h43
  5. Association 1:n sur une meme table
    Par dafalcon dans le forum Décisions SGBD
    Réponses: 15
    Dernier message: 27/04/2005, 09h07

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