2011-04-19 63 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