2015-06-09 30 views
0

我有以下几点: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 

多scrounging后,我有以下查询:

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,但我想找出一种方法来处理单个查询。

感谢您的帮助!

回答

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这种情况下MY 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 
+0

谢谢!这是问题。噢,在它被指出后很明显。 – crowhill

0

为什么Students表中包含program ID?学生表主要是为了传达关于学生的信息。你所做的事情似乎也在捕捉同一张桌子上的学生和课程之间的关系,这让我想到了一个问题,即一个学生是否只在一个生活中。

相反,为什么在会话表中没有程序ID?这样你不需要加入3个表格。我会很高兴地将会议与节目ID相关联。