我有以下内容:
Programs Students Sessions
-------- ---------- ----------
id id id
name program_id student_id
... ... time_in
time_out
课程有很多学生,学生有很多课程。每个会话都有一个持续时间,由time_in
和time_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中使用循环,但我想找出一种方法来处理单个查询。
感谢您的帮助!
答案 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相关联。