Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 14h57   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
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 :
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 .
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h08   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 :
1
2
SELECT COUNT(DISTINCT spectre) AS nb
FROM import
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h22   #3
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
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 :
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 :
1
2
SELECT COUNT(DISTINCT spectre) AS nb
FROM import
ça me retourne : 30803 lignes.

As tu une idée ?
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h42   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h50   #5
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
ok merci cinephil. Je pensais que justement la clause distinct permettait de filtrer ces cas de figures. Mais bon, ça me convient comme raisonnement .
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h15   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h39.


 
 
 
 
Partenaires

Hébergement Web