2017-04-10 37 views
3

我有一個數據庫,我已經存儲了一個表與用戶信息,一個表與測試(答案和點)和一個表與每個問題的用戶的答案。每個問題總共值1分,可能有一個或多個正確的答案。如果所有的答案都是正確的,並且用戶只檢查一個答案,他只會得到0.25分。 我想做一個查詢來檢查每個用戶的總分,但我沒有找到一個好的方法。MySQL數據庫爲考試(測驗測驗)查詢積分

用戶表:

+--------+------------+-----------+-------------------+------------+--------+ 
| 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意味着用戶選擇回答但可能是inccorect)

+------------+--------+---+---+---+---+ 
| 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

我想你是指5個答案中的1個正確= 0.2分(即1的20%),而不是0.25? –

+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

不客氣@GameZoneRO – wajeeh

0

你會加入問題和答案,並加上正確的答案。每個答案的公式很簡單:正確答案的數量除以5.您需要GROUP BY用戶ID和SUM來獲取每個用戶的結果。

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; 

在MySQL true = 1false = 0,所以(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