0

次のクエリ (教育アプリ用) は、特定のドリルでのユーザーのスコアを計算します。ユーザー、ドリル、質問、回答の 4 つのテーブルで動作します。各質問はドリルに属し、各回答は質問とユーザーに属します (回答はユーザーと質問に固有です)。質問は多肢選択式で、answer.selectedChoice = 1 の場合は正解です。ユーザーのドリルのスコアは、そのドリルの最新の 5 つの回答に基づいており、正解に割り当てられた重みは、回答の速さに基づいてスケーリングされます。

特定のドリルでユーザーのスコアを取得するだけでなく、ユーザーが少なくとも 1 つの質問に回答したすべてのドリルでユーザーのスコアを取得できるように、このクエリを拡張する方法を見つけようとしています。相関サブクエリとして書き直すことを検討してきましたが、これまでのところ私の努力は不十分です。どんな助けでも大歓迎です。

SELECT data.*,
    SUM(data.isCorrect * (IF(rawScore < 0, 0, IF(rawScore > 1, 1, rawScore)))) / 5 AS score
FROM
    (SELECT 
        answer.id,
        IF(answer.selectedChoice = 1, 1, 0) AS isCorrect,  
        (1 - (answer.timeElapsed - question.baseTime) / (4 * question.baseTime)) as rawScore
     FROM
        answer,
        question
     WHERE
        answer.questionID = question.id AND
        question.drillID = :drillID AND
        answer.userID = :userID
     ORDER BY
        answer.created DESC
     LIMIT 
        5) as data
4

1 に答える 1

0

以下で試してみてください。「少なくとも 1 つの質問に回答した」という条件で、answer.created 列を使用していると仮定します。アイデアは、1 人のユーザーのすべての質問を取得し、isCorrect、rawScore、スコア (ケースの場合) を計算し、必要なデータを question.drillID、answer.userID (ドリルごとのユーザーのスコア) でグループ化し、HAVING 句を使用して少なくとも 1 つの質問に回答したユーザー (少なくとも 1 つの質問に回答したユーザー)。

以下のクエリでは、間違った結果が得られる可能性があります。テーブル構造とサンプル データを投稿してください。デモを作成できます。

SELECT 
   answer.id,
   IF(answer.selectedChoice = 1, 1, 0) AS isCorrect,  
   (1 - (answer.timeElapsed - question.baseTime) / (4 * question.baseTime)) as rawScore
-- SUM(data.isCorrect * (IF(rawScore < 0, 0, IF(rawScore > 1, 1, rawScore)))) / 5 AS score
-- SUM(IF(answer.selectedChoice = 1, 1, 0) * (IF(1 - (answer.timeElapsed - question.baseTime) / (4 * question.baseTime)) < 0, 0, IF((1 - (answer.timeElapsed - question.baseTime) / (4 * question.baseTime)) > 1, 1, (1 - (answer.timeElapsed - question.baseTime) / (4 * question.baseTime)))))) / 5 AS score
FROM answer a 
INNER JOIN question q ON answer.questionID = question.id
GROUP BY 
   question.drillID, answer.userID
WHERE 
   answer.userID = :userID 
HAVING 
   COUNT(answer.created) >= 1;
于 2013-02-10T06:32:04.940 に答える