3

私は2つのテーブルquestionsとを持っていansweredます。answeredすべてのユーザーのすべての質問に対する回答が含まれています。1人のユーザーが複数回質問に答えることができます。質問には正しくまたは間違って答えることができます。

1つのカテゴリのすべての質問に対する正解と不正解の数を返すクエリを探しています。ただし、最新の回答のみを使用したいと思います。したがって、ユーザーが以前に同じ質問に間違って答えた場合、そして最近正しく答えた場合、私は最新の-正しい-1つだけを数えたいと思います。

これは私がこれまでに得たものです:

http://sqlfiddle.com/#!2/31e2e/2/0

SELECT a.correct, count(*) as count
FROM answered a JOIN questions q ON a.question_id = q.id 
WHERE a.user_id = 1 AND q.category_id = 1
GROUP BY correct

戻ります

|  CORRECT  |  COUNT  |
-----------------------
|  0        |   2     |
-----------------------
|  1        |   4     |
-----------------------

私が欲しいのは

|  CORRECT  |  COUNT  |
-----------------------
|  0        |   1     |
-----------------------
|  1        |   2     |
-----------------------
4

2 に答える 2

2

必要なクエリは次のとおりです。

SELECT a.correct, count(*) as counter
FROM answered a
JOIN (SELECT user_id, question_id, max(created) as maxCreated
      FROM answered
      GROUP BY user_id, question_id) aux
  ON a.user_id = aux.user_id AND
     a.question_id = aux.question_id AND
     a.created = aux.maxCreated
JOIN questions q ON a.question_id = q.id
WHERE a.user_id = 1 AND q.category_id = 1
GROUP BY a.correct

サブクエリを使用してaux、特定のユーザーからの質問に対する最後の回答がある行のみを選択します。

于 2012-07-31T15:37:36.987 に答える
1

与えられたときはいつでも正解だけを計算する必要がある場合:

select b.correct, count(*) from
(
SELECT a.question_id, max(a.correct) correct 
FROM answered a JOIN questions q ON a.question_id = q.id 
WHERE a.user_id = 1 AND q.category_id = 1
GROUP BY a.question_id
 ) B 
group by b.correct

後で間違った答えが正しい答えを排除し、最後/現在の結果のみが必要な場合:

select a.correct,count(*) from 
(
select user_id, question_id, max(created) maxDate 
from answered a WHERE a.user_id = 1
group by a.user_id, a.question_id
) m

join answered a 
 on m.question_id=a.question_id 
    and m.user_id=a.user_id
    and m.maxDate=a.created
join questions q on a.question_id=q.id

where q.category_id = 1

group by a.correct
于 2012-07-31T15:42:10.437 に答える