2015-06-09 58 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相關聯。