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 :

Requête sur une même table


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2013
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 66
    Points : 101
    Points
    101
    Par défaut Requête sur une même table
    Bonjour à tous

    J'ai la table suivante:
    Employe(Matricule,Nom,Prenom,#MatriculeChef)

    MatriculeChef est une clé étrangère qui provient de Matricule.Donc nous avons affaire là à une entité réflexive dans le mcd qui sais transformé dans le mld en la table énoncé ci-dessus.

    Je voudrais écrire une requête qui va me donner la liste des employé et leurs chefs.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Il suffit de faire une jointure de la table employe avec elle-même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Employe(Matricule,Nom,Prenom,#MatriculeChef)  
    SELECT  emp.matricule
        ,   emp.nom
        ,   emp.prenom
        ,   chf.nom     AS  nom_chf
        ,   chf.prenom  AS  prenom_chf
    FROM    employe emp
        LEFT JOIN
            employe chf
            ON  chf.matricule   = emp.matriculechef
    ;
    A noter la jointure externe qui permettra d'afficher les employés qui n'ont pas de chef.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut à tous.

    L'intérêt de faire une table qui s'auto référence, est justement de faire de la récursivité.
    Or MySql ne sait pas faire cela, donc l'intérêt reste limité.

    Sinon, pour résoudre ce genre de problème, à savoir obtenir le chef directe d'un employé, on le fait à partir d'une jointure de type "left outer join".
    Voici un exemple, en espérant que cela corresponde à votre attente :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `employe`
    --------------
     
    --------------
    CREATE TABLE `employe`
    (
      `id`            integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `matricule`     integer unsigned NOT NULL,
      `nom`           varchar(255)     NOT NULL,
      `prenom`        varchar(255)     NOT NULL,
      `matriculeChef` integer unsigned     NULL,
      CONSTRAINT `FK_01` FOREIGN KEY (`matriculeChef`) REFERENCES `employe` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `employe` (`matricule`, `nom`,`prenom`) VALUES
      (123, 'nom  1', 'prenom 1'),
      (456, 'nom  2', 'prenom 2'),
      (763, 'chef 3', 'prenom 3'),
      (899, 'nom  4', 'prenom 4')
    --------------
     
    --------------
    update `employe` set matriculeChef = 3 where matricule != 763
    --------------
     
    --------------
    select * from employe
    --------------
     
    +----+-----------+--------+----------+---------------+
    | id | matricule | nom    | prenom   | matriculeChef |
    +----+-----------+--------+----------+---------------+
    |  1 |       123 | nom  1 | prenom 1 |             3 |
    |  2 |       456 | nom  2 | prenom 2 |             3 |
    |  3 |       763 | chef 3 | prenom 3 |          NULL |
    |  4 |       899 | nom  4 | prenom 4 |             3 |
    +----+-----------+--------+----------+---------------+
    --------------
    select tb1.matricule   as 'matricule personnel',
           tb1.nom         as 'nom personnel',
           tb1.prenom      as 'prénom personnel',
           tb2.matricule   as 'matricule chef',
           tb2.nom         as 'nom chef',
           tb2.prenom      as 'prénom chef'
    from            employe as tb1
    left outer join employe as tb2
    on tb2.id = tb1.matriculeChef
    --------------
     
    +---------------------+---------------+------------------+----------------+----------+-------------+
    | matricule personnel | nom personnel | prénom personnel | matricule chef | nom chef | prénom chef |
    +---------------------+---------------+------------------+----------------+----------+-------------+
    |                 123 | nom  1        | prenom 1         |            763 | chef 3   | prenom 3    |
    |                 456 | nom  2        | prenom 2         |            763 | chef 3   | prenom 3    |
    |                 899 | nom  4        | prenom 4         |            763 | chef 3   | prenom 3    |
    |                 763 | chef 3        | prenom 3         |           NULL | NULL     | NULL        |
    +---------------------+---------------+------------------+----------------+----------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 17
    Points
    17
    Par défaut
    bonjour ,
    j'ai tombée au hasard dans ce forum
    bon malgré que ton probleme a été resolu mais j'ai une proposition que je pense qu'il est plus simple et plus clair
    le voilà:

    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
     
     
    CREATE TABLE employe
    (
      id            integer unsigned NOT NULL AUTO_INCREMENT primary key,
      matricule     integer unsigned NOT NULL,
      nom           varchar(255)     NOT NULL,
      prenom        varchar(255)     NOT NULL
     
    )
    CREAT TABLE relation
    (
      id_employe     integer unsigned ,
      id_chef           integer unsigned,
    constraint fk_employe foreign key (id_employe) references employe(id),
    constraint fk_chef foreign key (id_chef) references employe(id),
    constraint pk_relation priamry key (id_employe,id_chef)
    )
    simple non !!!
    j'espere qu'il te serviras

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut Super II.

    Tu ne réponds pas à la question posé par findjo :

    Citation Envoyé par findjo
    Je voudrais écrire une requête qui va me donner la liste des employé et leurs chefs.
    Ce qu'il veut, c'est une requête (un select) et non modifier la structure de sa table.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Requête de doublons sur une même table
    Par Swenn dans le forum SQL
    Réponses: 2
    Dernier message: 20/06/2013, 09h36
  2. Requête imbriquée sur une même table
    Par Bluesman72 dans le forum Oracle
    Réponses: 1
    Dernier message: 02/05/2012, 09h37
  3. Requête multicritère sur une même table
    Par M31ani3 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 26/09/2011, 15h13
  4. Requête conditionnelle sur une même table
    Par grafistolage dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/02/2010, 23h49
  5. Réponses: 1
    Dernier message: 08/09/2006, 15h56

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