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 :

Pourquoi que 2 users et pas 3 ?


Sujet :

Langage SQL

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 408
    Points : 5 763
    Points
    5 763
    Billets dans le blog
    1
    Par défaut Pourquoi que 2 users et pas 3 ?
    Bonjour,

    j'utilise les 3 tables suivantes :


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DROP TABLE IF EXISTS `users`;
    CREATE TABLE IF NOT EXISTS `users` (
      `id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `lastname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `firstname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
       `id_site` tinyint(2) NOT NULL,
      PRIMARY KEY (`sesa`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP TABLE IF EXISTS `site`;
    CREATE TABLE IF NOT EXISTS `site` (
      `id_site` tinyint(2) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) COLLATE utf8_bin NOT NULL,
      `id_country` tinyint(2) NOT NULL,
      PRIMARY KEY (`id_site`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP TABLE IF EXISTS `country`;
    CREATE TABLE IF NOT EXISTS `country` (
      `id_country` tinyint(2) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) COLLATE utf8_bin NOT NULL,
      `region` varchar(20) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id_country`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    J'ai fait une requête pas piquée des hannetons (c'est mon expression ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT u.sesa,u.lastname,u.firstname,u.email, s.name AS 'name_site',c.name AS 'country',u2.firstname AS 'manager_firstname',u2.lastname AS 'manager_lastname'
            FROM `users` u INNER JOIN `site` s ON u.id_site = s.id_site INNER JOIN `country` c ON s.id_country = c.id_country INNER JOIN `users` u2 ON u.sesa_manager = u2.sesa
    dont l'objet est d'afficher la liste des utilisateurs de la table users avec 4 informations (SESA (un identifiant), firstname, lastname et email), leur site et le pays du site, et enfin nom et prénom du manager.
    Ce que je ne comprends pas, c'est que ça me retourne que 2 lignes alors qu'il y a 3 enregistrements dans la table users. Sur l'un de ces 3 enregistrements, la colonne sesa_manager n'est pas renseignée et il se trouve que cet enregistrement n'apparaît pas dans la réponse à la requête. Quelle est la raison ?

    Pour info, contenu de la table users :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO `users` (`sesa`, `lastname`, `firstname`, `email`, `sesa_manager`, `id_site`) VALUES
    ('SESA--', 'L--', 'Mei', 'mei.l--@se.com', '', 3),
    ('SESA--', 'S--', 'Laurent', 'laurent.s--@se.com', 'SESA--', 2),
    ('SESA--', 'B--', 'Olivier', 'olivier.b--@se.com', 'SESA--', 2);

    et la réponse à la requête : Nom : Capt.png
Affichages : 176
Taille : 257,1 Ko
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 216
    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 216
    Points : 12 812
    Points
    12 812
    Par défaut
    Bonjour,
    Tu fais un INNER JOIN entre les deux alias de la table USER. Donc une ligne de USER qui n'a pas de correspondance (i.e un utilisateur sans responsable) n'est pas retournée.
    Il faut que la requête renvoie aussi les user sans responsable, il faut donc utiliser une jointure externe.

    Accessoirement quand une ligne n'a pas de responsable, la valeur de la colonne devrait être NULL et non ''. Sinon tu ne pourras pas mettre en place une contrainte d'intégrité.

    Tatayo.

    P.S. ta requête gagnerai largement en lisibilité si tu mettais un instruction pazr ligne:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select ..
    from ...
    inner join ...
    where ...

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 408
    Points : 5 763
    Points
    5 763
    Billets dans le blog
    1
    Par défaut

    C'est parfait :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT u.sesa,u.lastname,u.firstname,u.email, 
            s.name AS 'name_site',
            c.name AS 'country',
            u2.firstname AS 'manager_firstname',
            u2.lastname AS 'manager_lastname'
            FROM `users` u 
            INNER JOIN `site` s ON u.id_site = s.id_site 
            INNER JOIN `country` c ON s.id_country = c.id_country 
            LEFT OUTER JOIN `users` u2 ON u.sesa_manager = u2.sesa
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. Réponses: 63
    Dernier message: 28/12/2022, 11h16
  2. Réponses: 4
    Dernier message: 12/05/2014, 15h28
  3. Réponses: 6
    Dernier message: 01/03/2013, 13h23
  4. [MySQL] Contrôler que l'user soit pas existant [PHP 5.2.0]&[MYSQL 5.1.36]
    Par helkøwsky dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2010, 01h17
  5. Réponses: 3
    Dernier message: 01/08/2006, 12h32

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