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 :

[REQUETE GROUP BY] Petit problème dans le résultat d'une req


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut [REQUETE GROUP BY] Petit problème dans le résultat d'une req
    Bonjour,

    J'ai deux tables qui sont lié par les champs communes_TOPO.Numero et toponymes_TOPO.Ref_commune.

    (un toponyme est un hameau ou autres lieux dits rattachés à une communes, c'est une CIF de toponymes_TOPO vers communes_TOPO)

    Dont voila les structures respectives:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Structure de la table `communes_TOPO`
    #
     
    CREATE TABLE communes_TOPO (
      Numero int(11) NOT NULL auto_increment,
      Libelle varchar(41) default NULL,
      Code varchar(7) default NULL,
      Postal varchar(7) default NULL,
      PRIMARY KEY  (Numero)
    ) TYPE=MyISAM;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #  Structure de la table `toponymes_TOPO`
    #
     
    CREATE TABLE toponymes_TOPO (
      Numero int(11) NOT NULL auto_increment,
      Libelle_t varchar(41) default NULL,
      Ref_commune int(11) NOT NULL default '0',
      Ref_contributeur varchar(20) NOT NULL default '0',
      PRIMARY KEY  (Numero)
    ) TYPE=MyISAM;
    J'aimerais avoir une liste des communes contenant le numero, le libelle, et le nombre de toponyme correspondant à cette commune, ma requête est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT C.Numero, C.Libelle, C.Postal, COUNT( T.Libelle_t )
    FROM communes_TOPO AS C, toponymes_TOPO AS T
    WHERE C.Libelle
    LIKE 'A%' AND C.Numero = T.Ref_commune
    GROUP BY C.Numero
    ORDER BY C.Libelle ASC
    LIMIT 0 , 30
    Or je n'obtiens qu'une liste de communes qui contiennent au moins un toponyme.
    Je voudrais avoir une liste ou meme les communes sans hameaux soit présent.
    Exemple:
    Numéro | Nom | Nombre de Topo
    000001 | Auxerre | 50
    000002 | Paris | 10
    000001 | Pouillois | 3
    etc ...
    J'espère que je n'ai embrouillé personne ( enfin pas trop en tout cas).

    Merci d'avance.

    Ps:
    Ne vous offusquez pas si je ne peux répondre de suite, c'est le we et je n'ai pas accès à la toile tout le temps.

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 569
    Points
    19 569
    Billets dans le blog
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT C.Numero, C.Libelle, C.Postal, COUNT( T.Libelle_t )
    FROM communes_TOPO AS C LEFT OUTER JOIN  toponymes_TOPO AS T ON C.Numero = T.Ref_commune
    WHERE C.Libelle LIKE 'A%' 
    GROUP BY C.Numero
    ORDER BY C.Libelle ASC
    LIMIT 0 , 30

  3. #3
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 109
    Points : 111
    Points
    111
    Par défaut
    Le problème vient de ta jointure.

    Comme tu fait une jointure "standard" (INNER JOIN), ta requete ne te ramene que les communes pour lesquelles il existent un enregistrement dans la table toponymes.
    OR, comme toutes les communes n'ont pas de toponyme, celles qui n'e n'ont pas ne sont pas ramenées.

    je pense que si tu faisais une jointure externe gauche (LEFT JOIN), tu pourrais ramener toutes les communes peut importe s'il existe un enregistrement correspondant dans la table toponyme
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    SELECT C.Numero, C.Libelle, C.Postal, COUNT( T.Libelle_t ) 
    FROM communes_TOPO AS C LEFT OUTER JOIN toponymes_TOPO AS T ON C.Numero = T.Ref_commune 
    WHERE C.Libelle 
    LIKE 'A%'
    GROUP BY C.Numero 
    ORDER BY C.Libelle ASC 
    LIMIT 0 , 30
    pour plus d'info sur les jointures externes, voir le site de sqlpro

  4. #4
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut
    Quelle abruti j'ai oublié la norme ANSI .

    Merci du rappel les gars .

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2010, 14h15
  2. Réponses: 1
    Dernier message: 14/09/2007, 10h17
  3. Réponses: 12
    Dernier message: 23/05/2007, 11h37
  4. Petit Problème dans une GTK-Table
    Par simtim dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 16/04/2007, 12h41
  5. Requête SELECT problème dans les résultats trouvés ...
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/10/2005, 13h46

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