我有两个表来存储小学教室的学生数据:
Behavior_Log具有列student_id、comments、date Student_Roster具有列student_id、firstname、lastname
该数据库用于存储有关学生行为的日常评论,有时老师在给定的一天内对某个学生进行多条评论。
现在假设老师希望能够拉出每个学生的最后3条评论的列表,如下所示:
Jessica 7/1/09 talking
Jessica 7/1/09 passing notes
Jessica 5/3/09 absent
Ciboney 7/2/09 great participation
Ciboney 4/30/09 absent
Ciboney 2/22/09 great participation整个类的...and等
单个SQL查询必须为每个学生返回一组注释,以消除教师为班级中的每个学生单独运行查询所需的大量人力资源。
我知道这听起来类似于SQL Statement Help - Select latest Order for each Customer,但我需要显示每个人的最后3个条目,我不知道如何从这里到那里。
谢谢你的建议!
发布于 2009-07-06 16:53:29
这是我博客中这篇文章的一个稍微修改过的解决方案:
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发布于 2009-07-06 21:18:58
一种不同的方法是使用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 shttps://stackoverflow.com/questions/1087942
复制相似问题