MySQL:通过程序通过学生和会话时间

时间:2015-06-09 15:34:39

标签: mysql

我有以下内容:

Programs     Students      Sessions
--------     ----------    ----------
id           id            id
name         program_id    student_id
...          ...           time_in
                           time_out

课程有很多学生,学生有很多课程。每个会话都有一个持续时间,由time_intime_out描述。

我想要的是学生按课程在课程中花费的总小时数的摘要。所以示例结果如下:

Results:

Program Name       hours
-----------        ---------
Nursing            300 hours
Pharmacy           467 hours
PT                 598 hours

经过多次搜寻后,我有以下疑问:

SELECT programs.name, a.session_sum FROM(
    SELECT students.program_id AS stu_id, 
    TIME_TO_SEC(TIMEDIFF(time_out, time_in)) AS session_sum
    FROM students INNER JOIN sessions
    ON students.id = sessions.student_id
    GROUP BY students.program_id
) AS a, programs
WHERE programs.id = a.stu_id

它有效......有点儿。不幸的是,它似乎只适用于为给定学生找到的第一个会话,而不是所有学生可能拥有的会话。

我处于MySQL知识的边缘。我错过了什么?我应该废弃这个查询并朝着完全不同的方向前进吗?我也可以在Rails中使用循环,但我想找出一种方法来处理单个查询。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在你的内部SQL语句中:

SELECT students.program_id AS stu_id, 
TIME_TO_SEC(TIMEDIFF(time_out, time_in)) AS session_sum
FROM students INNER JOIN sessions
ON students.id = sessions.student_id
GROUP BY students.program_id

GROUP BY students.program_id但是您没有为session_sum提供任何汇总功能,这种情况我的SQL的默认行为是您只获得第一个结果(备注:MS) SQL Server会在这种情况下抛出错误)。

所以

SELECT students.program_id AS stu_id, 
SUM(TIME_TO_SEC(TIMEDIFF(time_out, time_in))) AS session_sum
FROM students INNER JOIN sessions
ON students.id = sessions.student_id
GROUP BY students.program_id

应该有效。但我现在手上还没有MY SQL可以尝试。顺便说一句,要在真正的单个查询中执行此操作,这也应该有效(但我现在无法尝试)。

SELECT 
   programs.name, 
   SUM(TIME_TO_SEC(TIMEDIFF(sessions.time_out, sessions.time_in))) AS session_sum 
FROM
   programs LEFT JOIN students ON programs.id = students.program_id
            INNER JOIN sessions ON students.id = sessions.student_id
GROUP BY programs.id

答案 1 :(得分:0)

为什么学生表包含program ID?学生表主要用于携带有关学生的信息。你正在做的事情似乎也是在同一张桌子上捕捉学生和节目之间的关系,这让我想到了如果一个学生只参加一个终身课程的问题。

相反,为什么不在会话表中有程序ID?这样你就不需要加入3个表了。我很乐意将会话与程序ID相关联。