SQL帮助:为每个学生选择最后3条评论?

时间:2009-07-06 16:32:21

标签: sql mysql

我有两张表来存储小学教室的学生数据:

Behavior_Log包含student_id,comments,date列 Student_Roster的列为student_id,firstname,lastname

数据库用于存储有关学生行为的每日评论,有时教师会在某一天对学生发表多条评论。

现在让我们说老师希望能够列出为每位学生提供的最后3条评论清单,如下:

Jessica 7/1/09在说话 杰西卡7/1/09通过笔记
杰西卡5/3/09缺席 Ciboney 7/2/09很棒的参与
Ciboney 4/30/09缺席 Ciboney 2/22/09很好的参与 ......等全班

单个SQL查询必须为每个学生返回一组注释,以消除教师为课堂中的每个学生运行单独查询所需的人力密集时间。

我知道这听起来很像 SQL Statement Help - Select latest Order for each Customer但我需要显示每个人的最后3个条目,我无法弄清楚如何从这里到达那里。

感谢您的建议!

2 个答案:

答案 0 :(得分:2)

我的博客中的这篇文章略微修改过的解决方案:

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

答案 1 :(得分:0)

另一种方法是使用group_concat函数和单个子选择以及该子选择的限制。

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