我有两张表来存储小学教室的学生数据:
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个条目,我无法弄清楚如何从这里到达那里。
感谢您的建议!
答案 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