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 :

un count different jointure 2 tables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut un count different jointure 2 tables
    Bonjour à tous,

    Voila je suis face à un problème que je n'arrive pas à m'expliquer dans le retour de résultat, je me demande si il n'y aurait pas une erreur dans ma requête SQL. Lorsque je comptabilise le nombre de ligne de ma table import avec la jointure sur la table genre, je me retrouve avec un total qui est supérieur au nombre de lignes contenues dans import

    Je m'explique, j'ai une table import qui contient de façon distinct 30803 lignes. A partir de cette table je fais une jointure avec une autre table pour compter de façon distincte le nombre de ligne en les regroupant par genre.

    Structure de ma table import :

    spectre varchar(50) | topo varchar(10) | annee int(11)

    Structure de ma table genrespe :

    topo varchar(10) | genre varchar(30)

    Pour comptabiliser je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select count(distinct import.spectre) as Total, genrespe.genre from import, genrespe
    where import.topo = genrespe.topo
    and annee=2011
    group by genrespe.genre
    order by Total desc
    En théorie je devrais me retrouver avec un total de 30803 lignes et j'ai bien plus .

  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
    1) Les jointures s'écrivent depuis 1992 avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Tu ne devrais pas utiliser de colonne signifiante, en plus de type VARCHAR, pour clé primaire et étrangère !
    Voir l'article de SQLPro à ce sujet.

    3) Que donne la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(DISTINCT spectre) AS nb
    FROM import
    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
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    Bonjour CinePhil,

    Merci pour ta réponse. J'ai effectivement mis la requête sans utiliser les inner join, le résultat est le même, ça comptabilise en trop.

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT count(DISTINCT import.spectre) AS Total, genrespe.genre FROM import
    inner join genrespe on import.topo = genrespe.topo
    AND annee=2011
    GROUP BY genrespe.genre
    ORDER BY Total DESC
    2) je vais y jeter un coup d'oeil, merci

    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(DISTINCT spectre) AS nb
    FROM import
    ça me retourne : 30803 lignes.

    As tu une idée ?

  4. #4
    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
    Et bien ça veut dire que 1 genre peut être associé à plusieurs spectres et que donc il y a des spectres qui sont comptabilisés dans plusieurs lignes résultat de ta requête. Ça ne me semble pas anormal.
    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 !

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    ok merci cinephil. Je pensais que justement la clause distinct permettait de filtrer ces cas de figures. Mais bon, ça me convient comme raisonnement .

  6. #6
    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
    Comme tu fais un groupement par genre, le DISTINCT va s'appliquer à l'intérieur de chaque valeur de genre.

    Le spectre 'Bleu' pourra être compté une fois dans le genre 'Masculin' et une fois dans le genre 'Féminin'.

    Voilà pourquoi au final, si tu additionnes tous les 'Total', tu pourras avoir l'illusion d'avoir plus de spectres différents qu'il n'y en a dans la table import.

    Si tu nous dis plus précisément ce que tu veux compter, on peut t'aider à construire la requête.
    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 !

Discussions similaires

  1. Jointure de table avec Interbase
    Par ada_b dans le forum InterBase
    Réponses: 21
    Dernier message: 12/05/2010, 19h52
  2. Jointure de tables et count
    Par gcvoiron dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/09/2009, 10h05
  3. Réponses: 3
    Dernier message: 08/11/2006, 23h04
  4. jointure sur table et procedure stocké
    Par pram dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2004, 21h56
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

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