2009-06-15 28 views
1

我已經有一段時間與SQL相同的問題,當我坐下來寫同樣的'蠻力'黑客我總是使用,我想那裏必須是一個更有效的方式來做我想做的事情。mysql-php查詢列表以建立表格

我有類似這樣的表格:

grades(gradeID, taskID, grade, username, date) 
tasks(taskID, task...) 
assignment(assignmentID, title...) 
assignment_tasks(assignmentID, taskID) 
assignment_students(assignmentID, username) 
students(username, forename...) 

最後5桌是相當靜態的,設置一次,獨自離開了大部分。

對於成績表,每次輸入新成績時都會創建新記錄。

我想爲一個任務生成一個彙總表,其中可能包含5個任務,每個學生可以爲每個任務設置任意數量的等級,最近的一個是我想要在概要。

我通常會做的是查詢學生列表和任務列表,然後爲每個學生構建一個巨大的嵌套for循環,通過每個任務查詢每個任務的最新成績,假設爲30學生,5個任務,這是152個查詢,這一直讓我覺得waaay太多了。

我想(希望)我在sql知識中有一個可怕的尷尬空白,並且有一個更聰明的方法來做到這一點。

編輯: 感謝您的回答 - 我還在構建實際的數據庫,所以我可以測試它,但我懷疑,答案下面不包括下列問題:

如果一個學生沒有嘗試任務/任務,在成績表中將不會有任何條目,但他們仍然需要在總結表中顯示每個任務的缺省成績(「u」)。我認爲這一點讓它更難。

再次編輯: 我現在有胚胎數據庫,它的工作原理是獲得最近成績的列表,其中沒有成績。轉移該列表現在是another question的主題!

回答

1
SELECT tasks.*, students.*, 
     (
     SELECT grade 
     FROM grades 
     WHERE grades.task_id = tasks.task_id 
       AND grades.username = students.username 
     ORDER BY 
       date DESC 
     LIMIT 1 
     ) AS lastgrade 
FROM assignments a 
JOIN assignment_tasks at 
ON  at.assignmentID = a.assignmentID 
JOIN assignment_students ast 
ON  ast.assignmentID = a.assignmentID 
JOIN tasks 
ON  tasks.task_id = at.task_id 
JOIN students 
ON  students.username = ast.username