2017-04-10 69 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