le plus grand d'une liste (trois tables en jeu)

le plus grand d'une liste (trois tables en jeu) - SQL/NoSQL - Programmation

Marsh Posté le 16-08-2009 à 00:07:12    

bonjour à tous,
 
j'ai une table étudiant
une table matière
les étudiants passent des examens (un ou plusieurs pour les matières)
 
Paul a passé un examen de SQL : le 15.11.2008, il a eu 11/20
Paul a passé un examen de SQL : le 20.01.2009 il a eu 15/20
et ainsi de suite
 
table étudiant : id étudiant, nom, prenom
table matiere : id matière, désignation
table examen : id étudiant, id matiere, date, note
 
 
Peut-on écrire une requete SQL qui me donne la liste des étudiants avec pour chacun d'entre eux uniquement la date et la note du dernier examen passé.
 
J'ai essayé :
 
select etu_nom, exam_date, exam_note
from etudiant e1, examen ex1
where etu_id=exam_id
      and exam_date =
          (select max(ex2.exam_date)
           from etudiant e2, examen ex2
           where e1.etu_id=e2.etu_id)  
group by etu_mysql
 
ca marche pas vraiment : aucun enregistrement retourné (la base est bien rempli (-: j'ai vérifié
Quelqu'un peut me dépanner ?
 
 
 
Merci à tous

Reply

Marsh Posté le 16-08-2009 à 00:07:12   

Reply

Marsh Posté le 16-08-2009 à 12:46:29    

déja avec un join c'est mieux, et du coup ca donne

Code :
  1. SELECT etu_nom, max(exam_date), exam_note
  2. FROM examen ex1
  3. INNER JOIN etudiant e1 ON e1.etu_id=ex1.exam_id
  4. GROUP BY etu_nom

Message cité 1 fois
Message édité par pataluc le 16-08-2009 à 12:46:39
Reply

Marsh Posté le 16-08-2009 à 19:42:20    

pataluc a écrit :

déja avec un join c'est mieux, et du coup ca donne

Code :
  1. SELECT etu_nom, max(exam_date), exam_note
  2. FROM examen ex1
  3. INNER JOIN etudiant e1 ON e1.etu_id=ex1.exam_id
  4. GROUP BY etu_nom



 
Merci pataluc pour ta proposition. je l'ai essayé mais le souci c'est que la note obtenue ne sera pas forcément celle de l'étudiant.
Je crois avoir trouvé : j'ai fait un select avec une jointure comme toi (a peu près) puis pour éviter le souci de correspondance note/étudiant j'ai fait un Having avec une clause Select à l'intérieur
 
Voilà la solution que j'ai trouvée, en fait il ne s'agissait pas d'examen mais d'étudiant inscrits dans une spécialité de licence pro à une date donnée (comme c'est compliqué j'ai expliqué le pb + simple mais équivalent avec examen  (désolé). ETU_SPE correspond à examen, etu_spe_spe_id correspondrait à la note
 
Voilà ma soluce :
SELECT etu_nom, ETU_SPE_spe_id, etu_spe_date_dbt
FROM etudiant e1, etu_spe es1
WHERE etu_mysql = `ETU_SPE_etu_id`
GROUP BY etu_mysql, etu_spe_spe_id
HAVING etu_spe_date_dbt = (
SELECT max( es2.etu_spe_date_dbt )
FROM etudiant e2, etu_spe es2
WHERE e1.etu_mysql = e2.etu_mysql
AND e2.etu_mysql = es2.etu_spe_etu_id )
LIMIT 0 , 60  
 
Merci encore
 

Reply

Marsh Posté le 17-08-2009 à 08:56:46    

ben écoute, chez moi ca marche, mais le petit jeu de données que je me suis créé pour tester (3 etud, 3 matiere, 4 exam) n'est peut être pas suffisamment représentatif...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed