2011-04-19 75 views
0

我有一個包含3個表的數據庫。獲取最新測試結果

第一個表中包含學生的領域FLDID,fldName,fldPIN等

第二個表包含的問題,學生必須與領域studentID和questionID

第三個表包含一行接聽清單每次學生回答一個問題並且具有學生ID,問題ID,回答和分數的字段。每個問題可能有多個答案。

我想要一個查詢,通過它可以獲取學生姓名(通過他們的PIN)以及他們需要回答的問題列表以及每個問題的最近分數。未回答的問題將得分爲零。

我不確定如何爲此進行連接。

非常感謝您的幫助。

戴夫

因爲我已經想出這個SQL。你可以看看,讓我知道這是否有效或非常糟糕!我很努力地理解你的帖子,所以努力想出這個。

SELECT 
`tbldelegate`.`fldFirstName`, 
`tbldelegate`.`fldSurname`, 
`tbldelegatequestions`.`fldQuestionID`, 
`latestScores`.`fldScore` 
FROM 
`tbldelegate` 
Left Join `tbldelegatequestions` ON `tbldelegatequestions`.`fldDelegateID` = `tbldelegate`.`fldID` 
Left Join (SELECT * 
FROM 
(SELECT max(fldID) as maxID 
FROM tblscoredata 
GROUP BY 
`tblscoredata`.`fldDelegateID`, 
`tblscoredata`.`fldSection`, 
`tblscoredata`.`fldQuestion` 
) AS x INNER JOIN `tblscoredata` AS f ON f.fldID = x.maxID) AS `latestScores` ON `latestScores`.`fldQuestion` = `tbldelegatequestions`.`fldQuestionID` 
WHERE 
`tbldelegate`.`fldPIN` = '11' 
+0

您如何識別哪個響應最後?第三個表中是否有時間戳? – 2011-04-19 12:17:22

+0

是的,第三個表中有一個時間戳和一個自動增量id列 – Dave 2011-04-19 15:08:34

回答

1

我在猜測一些表的名字,但是像這樣的事情應該可以做到。

SELECT s.fldName, sq.questionId, r.score 
FROM students s 
INNER JOIN studentQuestions sq ON s.fldID = sq.studentID 
LEFT JOIN questionResponses r ON sq.questionID = r.questionID AND sq.studentID = r.studentId 
WHERE s.fldPIN = 12345; 

嘗試使用此方法得到每個問題的學生必須回答的最新的,或無應答的結果(這是基於使用AUTO_INCREMENT ID和其值更高的ID更新記錄)。

SELECT s.fldName, sq.questionID, r.score 
FROM students s 
INNER JOIN studentQuestions sq ON s.id = sq.studentID 
LEFT JOIN questionResponses r ON sq.questionId = r.questionID AND sq.studentID = r.studentId 
LEFT OUTER JOIN questionResponses r2 ON sq.questionID = r2.questionID AND sq.studentID = r2.studentID AND r.id < r2.id 
WHERE r2.id IS NULL AND s.fldPIN = 12345 
+0

這將對未回答的問題顯示爲空。 – GordyD 2011-04-19 12:04:21

+0

感謝您的支持,但這是否也會列出對問題的所有回覆?我只想要一個問題的最新迴應。我將如何修改這個? – Dave 2011-04-19 12:08:10

+0

響應表中是否有其他字段?我們需要每個帖子的唯一ID或時間戳,以便我們可以顯示最新的回覆。 – GordyD 2011-04-19 12:21:58

0

戈登斯的回答非常好。然而,由於戴夫正在與MAX苦苦掙扎,我無法拒絕使用它發佈變體。 我的猜測是戈登的回答有更好的表現,他的回答可能是我選擇的兩個。

SELECT s.fldName, sq.questionID, r.score 
FROM students s 
INNER JOIN studentQuestions sq ON s.fldID = sq.studentID 
LEFT JOIN questionResponses r ON sq.questionId = r.questionID AND sq.studentID = r.studentId 
WHERE r.id = (SELECT MAX(id) FROM questionResponses r2 where r2.id = r.id) 
AND s.fldPIN = 12345