0

我觉得这应该很容易做到,因为我只是在某个地方犯了一些小错误。可能应该补充一点,我是一名教师,而不是编码员,所以我不太精通 SQL。此外,我确实在这里查看了一堆问题,但没有一个很有效。

我有表格,student_answers(id, student_id, question_id, answer, result, date_time)我想得到question_id,和学生为每个问题输入的最后一个答案。因此,如果他们对问题 7 回答了 3 次,我只想看到最后一个并且他们输入了。answerresultdate_timeanswerresult

出于教学目的,我不能在他们重新输入答案时简单地更新每一行。

我尝试了以下查询

SELECT id, question_id, answer, result, date  FROM Student_Answers
WHERE student_id = 505 AND question_id in (select id from Test_Questions q where q.test_id = 37) 
Group by question_id
having date = max(date)
ORDER BY Student_Answers`.`question_id` ASC

但这根本不包括有多个答案的问题,只有我505学生回答过一次的问题。学生 505 回答了问题 3 和 4 两次,其余的只回答了一次,我只看到了 1、2 和 5 的结果。

我试过这个查询

SELECT
    b.*
FROM
    (
        SELECT question_id, MAX(date) AS maxdate
        FROM TP_Student_Answers
        GROUP BY question_id
    ) a
INNER JOIN
    TP_Student_Answers b ON 
        a.question_id = b.question_id AND 
        a.maxdate = b.date 
        and b.student_id = 505 
        and b.question_id in (select id from TP_Questions q where q.test_id = 37)
ORDER BY
    b.question_id

但这只给了我3和4,而他只尝试过一次。任何帮助将不胜感激!

这是一个数据样本:

id   student_id question_id answer  result      date 

7133     505    1      a    correct 2012-11-16 09:03:58

7134    505 2      c    wrong   2012-11-16 09:03:58

7135    505 3      e    wrong   2012-11-16 09:03:58

7136    505 3      d    wrong   2013-12-16 09:03:58

7137    505 4      c    correct 2012-11-16 09:03:58

7138    505 4      d    wrong   2013-12-16 09:03:58

7139    505 5       blank   2012-11-16 09:03:58

当我运行查询时,我想看到:

7133      505   1      a    correct 2012-11-16 09:03:58

7134    505 2      c    wrong   2012-11-16 09:03:58

7136    505 3      d    wrong   2013-12-16 09:03:58

7138    505 4      d    wrong   2013-12-16 09:03:58

7139    505 5       blank   2012-11-16 09:03:58 

注意条目 7135 和 7137 被省略,因为每个问题都有稍后的答案

4

1 回答 1

0

检查此查询:(为所有学生提供所有问题的最新答案)

SELECT id, student_id, question_id, answer, result, date_time
  FROM (SELECT *,
               CASE
                  WHEN (@prevQ = question_id AND @prevS = student_id)
                  THEN
                     @marker := 0
                  ELSE
                     @marker := 1
               END
                  AS marker,
               @prevS := student_id,
               @prevQ := question_id
                  FROM student_answers
                ORDER BY student_id ASC, question_id ASC, date_time DESC) aView,
               (SELECT @prevQ = -1, @prevS = -1) a
 WHERE marker = 1;

对于一个特定的student_id和特定question_id的 s:

SELECT id, student_id, question_id, answer, result, date_time
  FROM (SELECT *,
               CASE
                  WHEN (@prevQ = question_id AND @prevS = student_id)
                  THEN
                     @marker := 0
                  ELSE
                     @marker := 1
               END
                  AS marker,
               @prevS := student_id,
               @prevQ := question_id
          FROM student_answers
         WHERE     student_id = 501
               AND question_id IN (SELECT id
                                     FROM TP_Questions q
                                    WHERE q.test_id = 37)
        ORDER BY student_id ASC, question_id ASC, date_time DESC) aView,
       (SELECT @prevQ = -1, @prevS = -1) a
 WHERE marker = 1;
于 2013-03-13T07:54:11.790 回答