2014-11-06 41 views
0

在SQL假設我們有一個名爲 '課程' courses_taken你如何使一個單元格的值相對於另一個表格?

課程

c_id key int 
name text 
credits int 

學生

s_id key int 
name text 
total_credits int 

courses_taken

id key int 
s_id foreign int 
c_id foreign int 

我的表,「學生, ''希望使total_credits字段基本上等於

select sum(c.credits) from courses c, students s, courses_taken ct where ct.c_id = courses.c_id and ct.s_id = s.s_id; 

,我假設的心不是這樣做,因爲我從來沒有用多表查詢工作之前,如果有人可以幫助我與SQL查詢的正確的方法,以及這將是巨大的。謝謝

回答

1

您的查詢幾乎是正確的,但缺少了GROUP BY條款,指出哪些行實際總結服務器。目前,您正在創建一個臨時表,其中每行包含關於單個課程的信息,並通過課程學分和學生姓名進行充實。選擇sum()將僅對所有課程和所有學生的所有學分進行總和。

因此,您需要按課程或學生分組,分別獲得課程或學生的積分總和。學生的結果將是:

select s.name, sum(c.credits) as total_credits from courses c, students s, courses_taken ct where ct.c_id = courses.c_id and ct.s_id = s.s_id GROUP BY s.s_id; 
+0

如果我要擺脫總學分字段,是否可以查詢學生(從學生中選擇*)並將總學分總和加入到結尾? – 2014-11-06 20:44:53

+0

select * from( select s.s_id,s.name,sum(c.credits)from course c,students s,courses_taken ct where ct.c_id = courses.c_id和ct.s_id = s.s_id GROUP BY s。 s_id) 其中s_id = 0;這會工作嗎? – 2014-11-06 20:58:53

+0

我的答案中的查詢將會列出所有學生姓名及其學分總數。你可以在where子句中添加AND s_id = 0,不需要子查詢。 – andy 2014-11-06 21:03:24

2

沒有什麼「內置」到MySQL,可以讓你直接做到這一點。每次更新courses_takencourses表時,您都必須編寫一些代碼來更新total_credits

有處理這雖然

  1. 把代碼寫在你的應用程序,以保持total_credits列幾個選項。

  2. 寫上使用coursescourses_taken表上的觸發器來保持total_credits列了最新的插入行時/更新/刪除數據庫的代碼。

  3. 擺脫total_credits列,並在需要查詢時只計算它(請參閱@ andy的回答)。

  4. 編寫一個定期計算total_credits的批處理作業,並接受它始終不總是100%正確的事實。

你挑將取決於應用程序的要求您在使用這個數據庫。

+0

選項3實際上似乎最符合邏輯的,但我的客戶想要的總學分在數據庫 – 2014-11-06 20:41:00

+0

@Cody表示 - 我會同意。也許你可以使用查詢創建一個視圖。那麼技術上就是「在數據庫中」:)我討厭它,當客戶指定實現細節而不真正理解技術時.. – 2014-11-06 20:45:00

+0

我想即將實施一個'黑客',閱讀@andy發表的評論,感謝您的幫助。非常感謝 – 2014-11-06 20:46:42

相關問題