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 :

Jointure sans le produit


Sujet :

Langage SQL

  1. #1
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut Jointure sans le produit
    Bonjour,

    J'étudie les jointures normalisées SQL2 et je ne comprends pas comment puis-je obtenir le résultat suivant :

    la liste des groupes avec la province correspondante et le nombre de personne appartenant au groupe

    Voici les 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
    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
     
    -- 
    -- Structure de la table `groupe`
    -- 
     
    CREATE TABLE `groupe` (
      `id_groupe` int(10) unsigned NOT NULL auto_increment,
      `nom` varchar(20) default NULL,
      `rue` varchar(30) default NULL,
      `cp` int(4) unsigned default NULL,
      `localite` varchar(20) default NULL,
      PRIMARY KEY  (`idgroupe`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
     
    -- 
    -- Contenu de la table `groupe`
    -- 
     
    INSERT INTO `groupe` VALUES (1, 'groupe 1', 'rue du cinéma', 6060, 'Gilly');
    INSERT INTO `groupe` VALUES (2, 'groupe 2', 'rue de la brèche', 7800, 'Ath');
    INSERT INTO `groupe` VALUES (3, 'groupe 3', 'Chaussée de la trève', 5000, 'Namur');
    INSERT INTO `groupe` VALUES (4, 'Groupe 4', 'Chemin de la trève', 1000, 'Bruxelles');
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `ign`
    -- 
     
    CREATE TABLE `ign` (
      `id_ign` int(10) NOT NULL auto_increment,
      `localite` varchar(50) NOT NULL,
      `commune` varchar(50) NOT NULL,
      `province` varchar(20) NOT NULL,
      `code` int(4) NOT NULL,
      PRIMARY KEY  (`id_ign`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6189 ;
     
    -- 
    -- Contenu de la table `ign`
    -- 
     
    INSERT INTO `ign` VALUES (169, 'Ath                           ', 'ATH                       ', 'Hainaut', 7800);
    INSERT INTO `ign` VALUES (360, 'Beez                          ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (807, 'Bruxelles                     ', 'BRUXELLES                 ', 'Bruxelles', 1000);
    INSERT INTO `ign` VALUES (1681, 'Frizet                        ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (1772, 'Gilly                         ', 'CHARLEROI                 ', 'Hainaut', 6060);
    INSERT INTO `ign` VALUES (1905, 'Gros-Buisson                  ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (2271, 'Heysel                        ', 'BRUXELLES                 ', 'Bruxelles', 1000);
    INSERT INTO `ign` VALUES (2827, 'La Croix                      ', 'ATH                       ', 'Hainaut', 7800);
    INSERT INTO `ign` VALUES (2875, 'La Pairelle                   ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (2878, 'La Plante                     ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (2962, 'Lanquesaint                   ', 'ATH                       ', 'Hainaut', 7800);
    INSERT INTO `ign` VALUES (3034, 'Le Piroi                      ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (3311, 'Lorette                       ', 'ATH                       ', 'Hainaut', 7800);
    INSERT INTO `ign` VALUES (3860, 'Namur                         ', 'NAMUR                     ', 'Namur', 5000);
    INSERT INTO `ign` VALUES (4874, 'Salzinnes                     ', 'NAMUR                     ', 'Namur', 5000);
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `individu`
    -- 
     
    CREATE TABLE `individu` (
      `id_individu` int(10) unsigned NOT NULL auto_increment,
      `fk_id_groupe` int(10) unsigned NOT NULL,
      `nom` varchar(20) default NULL,
      `prenom` varchar(20) default NULL,
      PRIMARY KEY  (`id_individu`),
      KEY `individu_FKIndex1` (`fk_id_groupe`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
     
    -- 
    -- Contenu de la table `individu`
    -- 
     
    INSERT INTO `individu` VALUES (1, 1, 'DELCO', 'Yvan');
    INSERT INTO `individu` VALUES (2, 2, 'Durand', 'Marcel');
    INSERT INTO `individu` VALUES (3, 2, 'DUPONT', 'Gerard');
    INSERT INTO `individu` VALUES (4, 2, 'VERMERSH', 'Jan');
    INSERT INTO `individu` VALUES (5, 3, 'JOS', 'Alphons');
    INSERT INTO `individu` VALUES (6, 3, 'GUILLIAN', 'Maude');
    INSERT INTO `individu` VALUES (7, 3, 'FOULON', 'Pierre');
    INSERT INTO `individu` VALUES (8, 3, 'FOULON', 'Anne');
    Voilà ma requête actuelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t1. * , t2.province, COUNT( t3.id_individu ) AS participant
    FROM groupe AS t1
    LEFT JOIN ign AS t2 ON t1.cp = t2.code
    LEFT JOIN individu AS t3 ON t3.fk_id_groupe = t1.idgroupe
    GROUP BY t1.id_groupe
    Le résultat du nom de participant n'est pas bon !

    Je suis sous MySQL. QQun peut me mettre sur la voie?

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par defcon_suny Voir le message
    Voilà ma requête actuelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1. * , t2.province, COUNT( t3.id_individu ) AS participant
    FROM groupe AS t1
    LEFT JOIN ign AS t2 ON t1.cp = t2.code
    LEFT JOIN individu AS t3 ON t3.fk_id_groupe = t1.idgroupe
    GROUP BY t1.id_groupe
    Le résultat du nom de participant n'est pas bon !
    La réponse n'est-elle pas dans la question ?
    Un COUNT retourne un entier, pas un nom !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 140
    Par défaut
    Lorsque l'on rencontre ce type de problème de comptage, il est toujours intéressant d'afficher le détail des lignes, sans regroupement, pour comprendre d'où pourrait provenir l'erreur.
    Dans ce cas précis, je pense que l'anomalie provient de la structure de la table IGN, dans laquelle il y a certainement plusieurs lignes qui correspondent au même code postal...

    Par ailleurs, avec un SGBD qui respecte les standards du langage SQL, la syntaxe que tu utilises serait refusée. En effet, toutes les colonnes de la clause SELECT qui ne font pas l'objet d'une fonction de regroupement doivent être détaillées dans la clause GROUP BY.
    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.

  4. #4
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut
    @CinePhil :

    C bien un entier qui doit être retourné.

    Citation Envoyé par al1_24 Voir le message
    Lorsque l'on rencontre ce type de problème de comptage, il est toujours intéressant d'afficher le détail des lignes, sans regroupement, pour comprendre d'où pourrait provenir l'erreur.
    Dans ce cas précis, je pense que l'anomalie provient de la structure de la table IGN, dans laquelle il y a certainement plusieurs lignes qui correspondent au même code postal...
    C'est exactement le problème mais je n'ai pas le choix de la structure des tables

    Ceci me renvoie un résultat correct mais pensez-vous que je puisse améliorer?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 
    groupe.*
    ign.commune,
    ign.province,
    groupe.localite ,
    TTT.CCC
    from ign join groupe on groupe.cp = ign.code join 
    (SELECT count( id_individu ) as CCC,fk_id_groupe
    FROM individu
    GROUP BY fk_id_groupe
    ) as TTT on groupe.idgroupe = TTT.fk_id_groupe
    group by groupe.id_groupe

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 140
    Par défaut
    à quoi sert le dernier GROUP BY ?
    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.

  6. #6
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut
    A rien! le résultat est pas correct!

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 140
    Par défaut
    Plusieurs communes répondent au même code postal, ton résultat ne peut être juste !
    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.

  8. #8
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut
    Effectivement... et je ne peux rien faire concernant la structure des tables.

    Ma requête atteint-elle une limite de l'SQL?

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 140
    Par défaut
    Citation Envoyé par defcon_suny Voir le message
    Ma requête atteint-elle une limite de l'SQL?
    Citation Envoyé par al1_24 Voir le message
    Par ailleurs, avec un SGBD qui respecte les standards du langage SQL, la syntaxe que tu utilises serait refusée. En effet, toutes les colonnes de la clause SELECT qui ne font pas l'objet d'une fonction de regroupement doivent être détaillées dans la clause GROUP BY.
    Non, ce sont les limites de son SGBD qui sont atteintes.
    Si tu écris une requête conforme à la syntaxe normalisée du langage, tes problèmes devraient se résoudre.
    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.

  10. #10
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut
    Ok merci. J'ai bien comprsi la leçon.

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

Discussions similaires

  1. Jointure sans relation de clef étrangère
    Par ophel dans le forum Plugins
    Réponses: 2
    Dernier message: 11/12/2010, 01h13
  2. Jointure sans clé etrangere
    Par brajae85 dans le forum SQL
    Réponses: 4
    Dernier message: 22/02/2010, 05h04
  3. [MySQL] [Doctrine] Jointure sans relation
    Par Cladjidane dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2009, 07h41
  4. Innodb Jointure sans LEFT JOIN
    Par mokadjo dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/04/2009, 17h50
  5. Jointure sans tenir compte de la casse
    Par Elise49 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 05/03/2009, 12h33

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