2017-04-10 8 views
3

私は、ユーザー情報付きのテーブル、テスト(回答とポイント)を持つテーブル、および各質問に対するユーザーの回答を含むテーブルを持っています。各質問は合計1点で価値があり、1つ以上の正解を持つことができます。すべての回答が正しい場合、ユーザーがただ1つをチェックすると、彼はわずか0.25ポイントを受け取るでしょう。 各ユーザーの合計ポイントを確認するクエリを作成したいのですが、良い方法は見つけられません。試験用のDB(テストクイズ)

Userテーブル:

+--------+------------+-----------+-------------------+------------+--------+ 
| userID | first_name | last_name | email    | password | points | 
+--------+------------+-----------+-------------------+------------+--------+ 
|  1 | Jhon  | Jhonny | [email protected] | secretPass |  0 | 
|  2 | Dan  | Dan  | [email protected]  | 1234  |  0 | 
|  3 | Dick  | Pop  | [email protected]  | 123456  |  0 | 
|  4 | Mihaela | Micky  | [email protected] | pass12  |  0 | 
+--------+------------+-----------+-------------------+------------+--------+ 

質問表: (1答えが良好であることを意味します - 私たちは、複数の正解を持つことができます)

+------------+--------------------------------------------------+---+---+---+---+ 
| questionID | question           | a | b | c | d | 
+------------+--------------------------------------------------+---+---+---+---+ 
|   1 | which of these are colors?      | 1 | 0 | 0 | 1 | 
|   2 | which of these are fruits?      | 1 | 1 | 1 | 0 | 
|   3 | which of these are programming language?   | 0 | 1 | 1 | 0 | 
|   4 | What is IPv6?         | 0 | 0 | 0 | 1 | 
+------------+--------------------------------------------------+---+---+---+---+ 

ユーザーの回答テーブル:(1ユーザーが選択した意味その答えは無実かもしれません)

+------------+--------+---+---+---+---+ 
| questionID | userID | a | b | c | d | 
+------------+--------+---+---+---+---+ 
|   1 |  1 | 1 | 1 | 0 | 0 | 
|   2 |  1 | 1 | 1 | 1 | 0 | 
|   1 |  3 | 1 | 0 | 1 | 1 | 
|   1 |  4 | 1 | 1 | 1 | 0 | 
|   3 |  1 | 1 | 0 | 1 | 1 | 
|   4 |  1 | 1 | 0 | 1 | 1 | 
|   1 |  2 | 1 | 1 | 0 | 0 | 
|   2 |  2 | 0 | 1 | 0 | 1 | 
|   3 |  2 | 0 | 1 | 1 | 1 | 
|   4 |  2 | 1 | 1 | 0 | 1 | 
|   2 |  3 | 1 | 0 | 0 | 1 | 
|   3 |  3 | 1 | 0 | 1 | 1 | 
|   4 |  3 | 1 | 0 | 1 | 1 | 
|   2 |  4 | 0 | 1 | 1 | 1 | 
|   3 |  4 | 1 | 0 | 0 | 1 | 
|   4 |  4 | 0 | 0 | 1 | 0 | 
+------------+--------+---+---+---+---+ 
+0

私は0.25、正しい= 0.2点(1すなわち20%)、1〜5の回答をしない意味推測? –

+0

あなたの問題がどこにあるのかははっきりしていません。質問と回答に参加する必要があることは確かです。また、値を比較する方法もわかっていて、おそらくユーザーごとにデータを集計する方法を知っています。だからどこにこだわっていますか? –

答えて

1

お試しください

SELECT 
    a.*, 
    u.name, 
    q.*, 
    # (a.a & q.a) + (a.b & q.b) + (a.c & q.c) + (a.d & q.d) userCorrects, 
    # (a.a + a.b + a.c + a.d) questionCorrects, 
    ((a.a & q.a) + (a.b & q.b) + (a.c & q.c) + (a.d & q.d))/(a.a + a.b + a.c + a.d) as userGrade 
FROM 
answer a 
    INNER JOIN 
user u ON a.userID = u.id 
    INNER JOIN 
question q ON a.questionID = q.id 
+0

ありがとう、私はそれが好きです! :) –

+0

ようこそ@ゲームZONERO – wajeeh

0

あなたは質問と回答に参加し、正しい答えを追加します。答えあたりの公式は単純に:正解の数を5で割ったものです。ユーザーごとに結果を得るには、GROUP BYのユーザーIDとSUMを使用します。 MySQLのtrue = 1false = 0

select u.userid, u.first_name, u.last_name, counted.points 
from 
(
    select 
    a.userid, 
    sum(((a.a = q.a) + (a.b = q.b) + (a.c = q.c) + (a.d = q.d) + (a.e = q.e))/5) 
     as points 
    from question q 
    join answer a on a.questionid = q.questionid 
    group by a.userid 
) counted 
join users u on u.userid = counted.userid; 

、そう(a.a = q.a)は1ときに正しいと0間違っています。

+0

ありがとう!やってみます。 –

0

素敵な質問... !!!

このクエリは、このシナリオで発生する可能性のあるすべての可能性のあるケースを支援します。

SELECT 
u.userID, u.first_name, u.last_name, u.email, 
SUM(1 - ((!(answer.a = question.a)) + (!(answer.b = question.b)) + (!(answer.c = question.c)) + (!(answer.d = question.d))) * 0.25) AS Score 
FROM answer 
INNER JOIN 
user u ON answer.userID = u.userID 
INNER JOIN 
question ON answer.questionID = question.questionID 
GROUP BY answer.userID