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 16/09/2011, 09h29   #1
Membre du Club
 
Avatar de djedje37et28
 
Étudiant
Inscription : septembre 2005
Messages : 220
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 220
Points : 51
Points : 51
Par défaut Requête sur tables formation, session

Bonjour,

J'ai quelques difficultés pour réaliser une requête sur des fiches formations.

Les fiches formations sont reliées à aucune,1 ou plusieurs sessions par l'intermédiaire du champ id de la table formation et du champ idformation de la table session.

Mes tables ressemblent donc à cela :
une table formation (id,titre)
une table session (id,idformation,debut,fin)


Pour le moment ma requête renvoie les formations ayant une session sur une plage de dates.

Code :
1
2
3
4
5
6
SELECT DISTINCT F.titre,F.id 
FROM `formation` F, `session` S 
WHERE  S.debut BETWEEN '2011-09-01' AND '2011-09-30'
  AND S.idformation = F.id 
  AND S.debut >'2011-09-16' 
ORDER BY titre
Néanmoins, certaines formations n'ont pas de session car elle court sur l'année. Ainsi, j'aimerai que ma requête affiche en plus ces formations n'ayant pas d'enregistrement dans la table session.

Faut il utiliser count, is null ?

Merci de votre aide

Cordialement
djedje37et28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 09h34   #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 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Apprends les jointures normalisées depuis 1992 et tu découvriras la jointure externe (LEFT JOIN) qui devrait t'être très utile !
__________________
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 10
Vieux 16/09/2011, 10h52   #3
Membre du Club
 
Avatar de djedje37et28
 
Étudiant
Inscription : septembre 2005
Messages : 220
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 220
Points : 51
Points : 51
Merci Cinephil !

J'ai pu le faire j'y prend goût !

Code :
1
2
3
4
5
6
7
SELECT DISTINCT F.titre,F.id 
FROM `formation` F
LEFT OUTER JOIN `session` S
ON F.id = S.idformation
WHERE  S.debut BETWEEN '2011-09-01' AND '2011-09-30'
  AND S.debut >'2011-09-16' OR S.idformation IS NULL
ORDER BY titre;
Je vais maintenant complexifier la chose car au départ la requête porte sur plusieurs critères qui s'empilent :
-Plage de dates
-domaine
-sous domaine
-région
-mot clés

La région étant lié à la session !

Code :
1
2
3
4
5
6
7
8
SELECT DISTINCT F.qualifiante,F.titre,F.reference,F.duree,F.dureedetail,F.id FROM `formation` F, `ville` V, `session` S
WHERE
1=1
AND S.debut BETWEEN '2011-09-01' AND '2011-09-30'AND S.idformation = F.id AND S.debut >'2011-09-16'
AND F.idclassification =19 AND F.idsclassification =58
AND F.iddomaine =36 AND V.idregion = 2
AND S.idformation = F.id AND V.id=S.idville
AND ( keywords LIKE '%test%' ) ORDER BY titre

J'essaye de retravailler cette requête en partant de tes conseils
djedje37et28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 12h14   #4
Membre du Club
 
Avatar de djedje37et28
 
Étudiant
Inscription : septembre 2005
Messages : 220
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 220
Points : 51
Points : 51
Et voici le résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT DISTINCT F.qualifiante, F.titre, F.reference, F.duree, F.dureedetail, F.id
FROM `formation` F
LEFT OUTER JOIN `session` S ON F.id = S.idformation
LEFT OUTER JOIN `ville` V ON V.id = S.idville
WHERE (
(
S.debut
BETWEEN '2011-09-01'
AND '2011-09-30'
AND S.debut & gt;
 
'2011-09-16'
) OR (
S.idformation IS NULL
)
) AND (
F.idclassification =19
) AND (
F.idsclassification =58
) AND (
V.idregion =2 OR V.idregion IS NULL
) AND (
keywords LIKE '%test%'
) ORDER BY titre;
Quelques tests de valeurs pour être sur maintenant.

Merci !
djedje37et28 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 00h48.


 
 
 
 
Partenaires

Hébergement Web