2009-07-06 6 views
3

J'ai deux tables pour stocker les données des élèves pour une classe d'école primaire:Aide SQL: sélectionnez les 3 derniers commentaires pour CHAQUE étudiant?

Behavior_Log a les colonnes student_id, les commentaires, la date Student_Roster a les colonnes student_id, prenom, LASTNAME

La base de données est utilisée pour stocker commentaires quotidiens sur le comportement des élèves, et parfois l'enseignant fait plusieurs commentaires sur un élève dans un jour donné.

Maintenant, disons que l'enseignant veut être en mesure de tirer une liste des 3 derniers commentaires pour chaque élève, comme ceci:

Jessica 01/07/09 parler
Jessica 01/07/09 passant des notes
Jessica 03/05/09 absent
Ciboney 02/07/09 grande participation
Ciboney 4/30/09 absent
Ciboney 22/02/09 grande participation ... et ainsi de suite pour l'ensemble classe

Le Une seule requête SQL doit renvoyer un ensemble de commentaires pour chaque étudiant afin d'éliminer le besoin, pour l'enseignant, d'utiliser des requêtes distinctes pour chaque étudiant de la classe. Je sais que cela ressemble à SQL Statement Help - Select latest Order for each Customer mais j'ai besoin d'afficher les 3 dernières entrées pour chaque personne, je ne peux pas comprendre comment aller d'ici à là.

Merci pour vos suggestions!

Répondre

2

Une solution légèrement modifiée de cet article dans mon blog:

 

SELECT student_id, date, comment 
FROM (
     SELECT student_id, date, comment, (@r := @r + 1) AS rn 
     FROM (
       SELECT @_student_id:= -1 
       ) vars, 
       (
       SELECT * 
       FROM 
         behavior_log a 
       ORDER BY 
         student_id, date DESC 
       ) ao 
     WHERE CASE WHEN @_student_id <> student_id THEN @r := 0 ELSE 0 END IS NOT NULL 
       AND (@_student_id := student_id) IS NOT NULL 
     ) sc 
JOIN Student_Roster sr 
ON  sr.student_id = sc.student_id 
WHERE rn <= 3 
0

Une autre approche serait d'utiliser la fonction group_concat et un sous sélectionnez et une limite sur cette sous-sélection.

select (
    select group_concat(concat(student, ', ', date,', ', comment) separator '\n') 
     from Behavior_Log 
     where student_id = s.student_id 
    group by student_id 
     limit 3) 
    from Student_Roster s 
Questions connexes