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 20/10/2011, 16h51   #1
Invité de passage
 
Carole
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Carole

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 2
Points : 2
Par défaut Pb Requete selon criteres de periode et de nom

Bonjour,
Je débute sous MySql. Pour les besoins de mon stage, j'ai construit une base Mysql qui gère des stagiaires envoyés par des entreprises dans un centre de formation. Parmi la liste de mes requêtes, je dois en concevoir une qui permet d'afficher, selon une période donnée (exemple entre le 01/01/2010 et le 31/12/2010), la liste des stagiaires envoyés par une même entreprise ainsi que d'afficher certains détails de leurs formations.Pour le moment, ne sachant pas faire la requête de façon "générique", je l'ai conçue avec une entreprise "en dur" et une période fixe aussi.
Elle fonctionne (ne renvoie pas d'erreur) mais ne me renvoie qu'un seul stagiaire, alors que j'ai fait en sorte d'en avoir au moins 2 dans ma base de test.je ne comprends pas où est l'erreur dans ma requête, pouvez-vous m'aider SVP? Je joint le mld pour une meilleure clarté. Voici le code de ma requete :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT J.nvFormation, S.idStagiaire, S.nomStag, S.prenomStag, S.dateNaissanceStag, E.idEntreprise, E.nomEntreprise, 
	L.idLangue, L.libelleLangue, TY.idTypeForm, TY.typeformation,
				F.idFormation, F.refStage, F.dateDebut, F.dateFin, F.duree,F.nivEntree,F.nivSortie,F.BulatsEcrit, F.BulatsOral, F.ToeicScoreFinal, F.Observations
FROM jonctionstagentform AS J
INNER JOIN Stagiaire AS S
  ON J.idStagiaire = S.idStagiaire
INNER JOIN Entreprise AS E
  ON J.idEntreprise = E.idEntreprise
INNER JOIN Formation AS F
  ON J.idFormation = F.idFormation
INNER JOIN Intervenant AS I
  ON F.idIntervenant = I.idIntervenant
INNER JOIN Langue AS L
  ON F.langueStage = L.idLangue
INNER JOIN TypeFormation AS TY
  ON F.idTypeFormation = TY.idtypeform
INNER JOIN Intervenant
  ON F.autreIntervenant = Intervenant.idintervenant
WHERE E.nomEntreprise = nomentreprise  
  AND F.dateDebut AND F.dateFin BETWEEN  '2010-01-01' AND '2010-12-31'
Merci d'avance,
Cordialement,
Carole
Images attachées
Type de fichier : png MLDNewEurogrille.png (30,0 Ko, 2 affichages)
fraguija est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 17h07   #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 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Ta requête ne devrait même rien renvoyer du tout par rapport à ton modèle de données, si ce n'est une erreur !
Code :
1
2
3
4
INNER JOIN Formation AS F
  ON J.idFormation = F.idFormation
INNER JOIN Intervenant AS I
  ON F.idIntervenant = I.idIntervenant
idIntervenant n'existe pas dans la table Formation ; il y a une table associative "enseigner" entre les deux.

Si idInterv et autreInterv sont des clés étrangères référençant intervenant, il manque deux associations dans le MLD mais à mon avis ces colonnes ne devraient aps exister. Ou alors ton MLD n'est pas à jour ?

Es-tu sûr que tes deux stagiaires répondent aux conditions fixées dans le WHERE de ta requête ? Si oui, simplifie ta requête en supprimant tout ce qui ne vient pas directement des tables Formation, Stagiaire, Entreprise et jonctionstageentform et regarde si tu obtiens bien les deux stagiaires souhaités.

Bon courage !
__________________
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 20/10/2011, 18h00   #3
Invité de passage
 
Carole
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Carole

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 2
Points : 2
Bonjour Philippe et merci
En fait, je suis allée un peu vite en besogne concernant le mld joint : je l'ai fait depuis analyseSI et ce dernier refuse la meme appellation pour les cles etrangeres. Mais elles sont bien réferencées dans ma bdd (dans ma table formation, j'ai donc 2 cles etrangeres (idIntervenant et autreIntervenant) pointant sur la meme cle primaire (idIntervenant) de la table Intervenant. En revanche, il est vrai que je n'ai ajouté la 2eme cle qu'apres avoir fait le mld et donc je n'ai pas fait de table associative...Je pense rectifier ma base demain afin qu'elle soit "en regle"
C'est pourquoi je n'ai pas de renvoi d'erreur je pense.
Concernant les conditions de ma requêtes, oui mes 2 stagiaires travaillent dans la même entreprise et sont tous les 2 venus au cours de l'année 2010, l'un pour un type de formation "stage", l'autre pour un type "Bulats". Je vais donc suivre tes conseils et tester sans demander l'affichage du type et du contenu des formations correspondantes. Je te tiens au courant dès demain.
Merci encore
fraguija est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 09h38   #4
Invité de passage
 
Carole
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Carole

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 2
Points : 2
Bonjour, après avoir procédé par élimination j'ai trouvé l'origine de l'erreur : comme il y avait des dissemblances entre les 2 formations sur une colonne (autreIntervenant), le "INNER JOIN" ne convenait pas. je l'ai remplacé par une jointure externe et ça fonctionne !!!

Voici le code à présent :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT J.nvFormation, S.idStagiaire, S.nomStag, S.prenomStag, S.dateNaissanceStag, E.idEntreprise, E.nomEntreprise, 
				L.idLangue, L.libelleLangue, TY.idTypeForm, TY.typeformation,
				F.idFormation, F.refStage, F.dateDebut, F.dateFin, F.duree,F.nivEntree,F.nivSortie,F.BulatsEcrit, F.BulatsOral, F.ToeicScoreFinal, F.Observations
				FROM jonctionstagentform AS J
							INNER JOIN Stagiaire AS S
											ON J.idStagiaire = S.idStagiaire
							INNER JOIN Entreprise AS E
											ON J.idEntreprise = E.idEntreprise
							INNER JOIN Formation AS F
											ON J.idFormation = F.idFormation
							INNER JOIN Intervenant AS I
											ON F.idIntervenant = I.idIntervenant
							INNER JOIN Langue AS L
											ON F.langueStage = L.idLangue
							INNER JOIN TypeFormation AS TY
											ON F.idTypeFormation = TY.idtypeform
							LEFT JOIN Intervenant
											ON F.autreIntervenant = Intervenant.idintervenant
WHERE E.nomEntreprise = "nomEntreprise" AND F.dateDebut AND F.dateFin BETWEEN  '2010-01-01' AND '2010-12-31'
fraguija est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 11h42   #5
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Juste pour vérifier
Code sql :
F.dateDebut AND F.dateFin BETWEEN  '2010-01-01' AND '2010-12-31'
teste que F.dateDebut est VRAI et que F.dateFin est compris entre les deux bornes et non que les deux dates sont comprises entre ces deux bornes.
C'est bien ce que tu souhaites ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 22h25   #6
Invité de passage
 
Carole
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Nom : Carole

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 2
Points : 2
Bonsoir,
En fait, pour cette requête, les 2 dates doivent être comprises dans l'année civile. Je dois également créer une requête qui pointera sur un intervalle de temps d'un an, mais il m'a semblé plus facile dans un premier temps d'essayer avec une année "pleine"
fraguija est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 21h30   #7
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par fraguija Voir le message
Bonsoir,
En fait, pour cette requête, les 2 dates doivent être comprises dans l'année civile. Je dois également créer une requête qui pointera sur un intervalle de temps d'un an, mais il m'a semblé plus facile dans un premier temps d'essayer avec une année "pleine"
Quel rapport avec ma remarque ?????
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est actuellement 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 16h36.


 
 
 
 
Partenaires

Hébergement Web