Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 05/12/2010, 15h00   #1
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 71
Points : 17
Points : 17
Par défaut Jointure par la gauche

Bonjour,

Je vous explique le schéma de ma BD (je n'ai fait que la reprendre, je ne l'ai pas créée ):

table -dateconv qui contient un id et les dates associées
- inscription
- orientation
- nomoption
- nonsection
- categorie_ens

Je veux savoir jour/jour combien d'inscriptions il y a eu dans une catégorie donnée, et ce même si il n'y a pas eu d'inscriptions un jour -> par exemple le 27/06 : 0 inscriptions.

Voici ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT dateconv.valdate
 , COUNT(IF(categorie_ens.cateid IS NOT NULL,ins_rt_etu,NULL)) 
FROM dateconv 
 LEFT JOIN inscription 
  ON inscription.insdate=dateconv.id_date 
 LEFT JOIN orientation 
  ON orientation.oriid = inscription.ins_rt_ori 
 LEFT JOIN nomoption
  ON nomoption.nopid=orientation.ori_rt_nop 
 LEFT JOIN nomsection
  ON nomsection.nscid = nomoption.nop_rt_nsc
 LEFT JOIN categorie_ens
  ON categorie_ens.cateid = nomsection.nsc_rt_cate
  AND categorie_ens.catenom="Technique" 
WHERE dateconv.id_date>=39985 
 AND dateconv.id_date<=39992  
GROUP BY (dateconv.id_date)
Si je retire le count et le group by, il m'affiche toutes les inscriptions qui se sont déroulées entre les dates sélectionnées, et remplace la catégorie par NULL si ce n'est pas "Technique".

Y a-t-il une possibilité pour ne pas afficher du tout les lignes où la catégorie est NULL?

Le but est de pouvoir alléger le traitement pour le COUNT car j'ai 170 dates à afficher, et lorsque j'en affiche 60, celà prend déjà plus de 30 secondes...

Merci
rousseau_damien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 18h20   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Y a-t-il une possibilité pour ne pas afficher du tout les lignes où la catégorie est NULL?
Il suffit de filtrer dans le WHERE sur "technique" et non dans la condition de jointure (le ON)

Sinon concernant les perfs, je ne pense pas que tu ais besoin de tous ces LEFT JOIN, à mon avis seul le 1er est vraiment nécessaire fonctionnelement.
Qu'est ce que ça donne avec des INNER JOIN dans une sous requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT dateconv.valdate
 , COUNT(*) 
FROM dateconv 
 LEFT JOIN
	(SELECT inscription.insdate
	 FROM inscription 
	 JOIN orientation ON orientation.oriid = inscription.ins_rt_ori 
 	 JOIN nomoption ON nomoption.nopid=orientation.ori_rt_nop 
 	 JOIN nomsection ON nomsection.nscid = nomoption.nop_rt_nsc
 	 JOIN categorie_ens ON categorie_ens.cateid = nomsection.nsc_rt_cate
	 WHERE categorie_ens.catenom="Technique" 
	) AS t
  ON dateconv.id_date = t.insdate
WHERE dateconv.id_date>=39985 
 AND dateconv.id_date<=39992  
GROUP BY dateconv.id_date
Sinon ta base est elle correctement indexée ?
Tu peux également regarder le plan d'exécution de la requête avec EXPLAIN
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2010, 18h30   #3
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 71
Points : 17
Points : 17
Super,

Ce qu'il me fallait exactement était :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT dateconv.valdate
 , COUNT(t.ins_rt_etu) 
FROM dateconv 
 LEFT JOIN
	(SELECT inscription.insdate, inscription.ins_rt_etu
	 FROM inscription 
	 JOIN orientation ON orientation.oriid = inscription.ins_rt_ori 
 	 JOIN nomoption ON nomoption.nopid=orientation.ori_rt_nop 
 	 JOIN nomsection ON nomsection.nscid = nomoption.nop_rt_nsc
 	 JOIN categorie_ens ON categorie_ens.cateid = nomsection.nsc_rt_cate
	 WHERE categorie_ens.catenom="Technique" 
	) AS t
  ON dateconv.id_date = t.insdate
WHERE dateconv.id_date>=39985 
 AND dateconv.id_date<=40194 
GROUP BY dateconv.id_date
Un grand merci
rousseau_damien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 18h35   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
oui c'est le count(*), désolé, que donne cette requête:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT dateconv.valdate
 , COUNT(t.insdate) 
FROM dateconv 
 LEFT JOIN
	(SELECT inscription.insdate
	 FROM inscription 
	 JOIN orientation ON orientation.oriid = inscription.ins_rt_ori 
 	 JOIN nomoption ON nomoption.nopid=orientation.ori_rt_nop 
 	 JOIN nomsection ON nomsection.nscid = nomoption.nop_rt_nsc
 	 JOIN categorie_ens ON categorie_ens.cateid = nomsection.nsc_rt_cate
	 WHERE categorie_ens.catenom="Technique" 
	) AS t
  ON dateconv.id_date = t.insdate
WHERE dateconv.id_date>=39985 
 AND dateconv.id_date<=39992  
GROUP BY dateconv.id_date
Et sinon niveau perf c'est mieux ?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 18h37   #5
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 71
Points : 17
Points : 17
Les performances ne sont même pas comparables, j'ai la réponse en 1seconde et quelque chose pour l'année complète, donc en mettant :

Code :
1
2
WHERE dateconv.id_date>=39985 
 AND dateconv.id_date<=40194
rousseau_damien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 18h39   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
cool... bonne fin de journée
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h34.


 
 
 
 
Partenaires

Hébergement Web