我有一个包含3个表的数据库。
第一个表包含具有字段fldID,fldName,fldPIN等的学生。
第二个表格包含学生必须使用字段studentID和questionID
回答的问题列表第三个表格每次学生回答一个问题时都包含一行,并且包含studentID,questionID,response和score字段。每个问题可能有多个答案。
我想要一个查询,允许我获取学生姓名(通过他们的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 :(得分: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
答案 1 :(得分:0)
戈登的回答非常好。然而,由于Dave正在努力与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