2009-07-06 45 views
3

我有两个表来存储学生数据的一年级,学校教室:SQL帮助:为每位学生选择最后3条评论?

Behavior_Log有列student_id数据,评论,日期 Student_Roster有列student_id数据,名字,姓氏

数据库用于存储每日评论有关学生的行为,有时老师会在给定的一天内对学生发表多次评论。

现在让我们说教师要能够拉起每个学生进行的最后3条评论列表,像这样:

杰西卡09年7月1日谈论
杰西卡09年7月1日传纸条
杰西卡09年5月3日缺席
Ciboney 09年7月2日大参与
Ciboney零九年四月三十○日缺席
Ciboney 09年2月22日伟大的参与 ...等整个class

The单个SQL查询必须为每个学生返回一组评论,以消除教师为班级中的每个学生运行单独查询的人力时间密集型需求。

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

感谢您的建议!

回答

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 
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