【问题标题】:SQL help: select the last 3 comments for EACH student?SQL 帮助:为每个学生选择最后 3 条评论?
【发布时间】:2010-11-08 10:41:52
【问题描述】:

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

Behavior_Log 具有列 student_id、cmets、date Student_Roster 具有列 student_id、firstname、lastname

该数据库用于存储有关学生行为的每日 cmets,有时教师会在给定日期制作多个关于一个学生的 cmets。

现在假设老师希望能够提取为每个学生制作的最后 3 个 cmets 的列表,如下所示:

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

...全班以此类推

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

我知道这听起来类似于 SQL Statement Help - Select latest Order for each Customer 但我需要显示每个人的最后 3 个条目,我不知道如何从这里到那里。

感谢您的建议!

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

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

     

    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
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 2015-03-16
        • 1970-01-01
        • 2010-09-24
        • 2016-08-03
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多