0

これは本当に簡単にできるはずだと思いますが、どこかで小さな間違いを犯しているだけです。おそらく、私はコーダーではなく教師であることを付け加えておく必要があります。そのため、私は SQL に精通していません。さらに、私はここでたくさんの質問を見ましたが、どれもうまくいきませんでした.

学生が各質問に入力した最後の回答について、、、およびstudent_answers(id, student_id, question_id, answer, result, date_time)を取得したいテーブルがあります。そのため、質問 7 に 3 回回答した場合、最後に入力したものだけを見たいと思います。question_idanswerresultdate_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 が 1 回回答した質問しかありませんでした。学生 505 は質問 3 と 4 に 2 回答え、残りは 1 回だけ答えました。私は 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 に答える