2017-12-23 9 views
0

いくつかの条件に基づいてフィールドのカウントを取得しようとしています。しかし、私はまだ望みの結果を達成することはできません。MySQLでケースを使用して特定のフィールドの数を取得する方法

表::クイズの質問:

qq_id | qq_type | qq_title 
---------------------------------------------------- 
1  | 1  | This is a multiple choice question 
2  | 2  | This is a single choice question 
3  | 4  | This is a descriptive type question 

表::クイズ質問の詳細:

qqd_id | qqd_question_id | qqd_option_text | qqd_option_is_answer 
----------------------------------------------------------------- 
1  | 1    | Yes    | 1 
2  | 1    | No    | 2 
3  | 1    | May Be   | 1 
4  | 2    | Yes    | 1 
5  | 2    | No    | 2 

表::クイズ参加者の回答:

qa_id | qa_quiz_id| qa_participant_id | qa_question_id | qa_answer** 
------------------------------------------------------------------------------- 
1  | 1   | 3     | 1    | 1 
2  | 1   | 3     | 1    | 3 
3  | 1   | 3     | 2    | 4 
4  | 1   | 3     | 3    | null 

**フィールドqa_answerは、クイズの質問の詳細テーブルのqqd_idです。

質問(qq_id = 1)は多項選択問題ですので、1つ以上の回答があります。 質問(qq_id = 2)には回答が1つしかなく、質問(qq_id = 3)は説明的な質問になります。管理者によって定義された

答えは質問の詳細テーブルに格納されている、我々はqqd_question_id = 1は、それらの2が(qqd_id 1 & 3)

正解数と合計の計算が正しいされた3つの答えを持って見ることができます(QQ_id = 1は1つの質問ですが複数の回答があるため)3と答えています(これは間違っていて、2と予想されます)。正しい)。

私はlaravel 5.4フレームワークを使用しています。私は次のクエリでクエリをテストしています。

注:テスト目的のために、テーブルに追加フィールド(qa_is_correct_answer)を追加しました(詳細テーブルとの結合なし)。無視してください。

DB::table('quiz_answers AS QA') 
      ->select(DB::Raw('QA.*, SUM(QA.qa_is_correct_answer = 1) AS correct, COUNT(DISTINCT QA.qa_question_id) AS total_answered')) 
      ->where('QA.qa_quiz_id',$quizID) 
      ->where('QA.qa_participant_id',$participantID) 
      ->groupBy('QA.qa_quiz_id')   
      ->get(); 

SQLフィドル:http://sqlfiddle.com/#!9/ba1650/3

+1

あなたのデータに完全に従っているわけではありませんが、グループを実行中に「QA。*」を選択すると無効となります。 –

+0

希望の結果が表示されません。 https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-queryを参照してください。 – Strawberry

+0

@Strawberry私はSQLのフィドル – Shan

答えて

1

私はLaravelに翻訳する方法を知りませんが、別の正解として複数の選択肢の質問にすべての答えを数えてから保つために、次のものが必要サブクエリでグループ化します。

SELECT qa.*, SUM(qa.correct = 1) AS correct, COUNT(*) AS total_answered 
FROM (
    SELECT qa.*, MIN(qa_is_correct_answer) AS correct 
    FROM quiz_answers AS qa 
    GROUP BY qa_quiz_id, qa_question_id 
) AS qa 
GROUP BY qa.qa_quiz_id 

DEMO

ところで、それは正しくないために正しいと2ため1を使用することがかなり奇妙です。バイナリオプションの場合、通常01を使用し、1を真値とします。

+0

ありがとう、まさに私が探していたもの! 。私はそれが正しいと間違ってそれぞれの値1と2を使用することはかなり奇妙だと知っている;)。しかし、私はこの方法を使用する必要があります – Shan

関連する問題