Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于考试(测试测验)的MySQL数据库查询分数_Mysql_Sql - Fatal编程技术网

用于考试(测试测验)的MySQL数据库查询分数

用于考试(测试测验)的MySQL数据库查询分数,mysql,sql,Mysql,Sql,我有一个数据库,其中存储了一个包含用户信息的表,一个包含测试(答案和分数)的表,以及一个包含每个问题的用户答案的表。每个问题总共得1分,可以有一个或多个正确答案。如果所有答案都是正确的,并且用户只检查了一个,那么他只会得到0.25分。 我想做一个查询来检查每个用户的总分,但我没有找到一个好方法 用户表: +--------+------------+-----------+-------------------+------------+--------+ | userID | first_na

我有一个数据库,其中存储了一个包含用户信息的表,一个包含测试(答案和分数)的表,以及一个包含每个问题的用户答案的表。每个问题总共得1分,可以有一个或多个正确答案。如果所有答案都是正确的,并且用户只检查了一个,那么他只会得到0.25分。 我想做一个查询来检查每个用户的总分,但我没有找到一个好方法

用户表:

+--------+------------+-----------+-------------------+------------+--------+
| userID | first_name | last_name | email             | password   | points |
+--------+------------+-----------+-------------------+------------+--------+
|      1 | Jhon       | Jhonny    | jhon@yahoo.com    | secretPass |      0 |
|      2 | Dan        | Dan       | dan@yahoo.com     | 1234       |      0 |
|      3 | Dick       | Pop       | dd@yahoo.com      | 123456     |      0 |
|      4 | Mihaela    | Micky     | mihaela@yahoo.com | pass12     |      0 |
+--------+------------+-----------+-------------------+------------+--------+
问题表: (1表示答案是好的-我们可以有多个正确答案)

用户答案表:(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

你要把问题和答案联系起来,把正确的答案加起来。每个答案的公式很简单:正确答案的数量除以5。您可以按用户ID和总和分组,以获得每个用户的结果

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=1
false=0
,因此
(a.a=q.a)
正确时为1,错误时为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

我猜你的意思是5个答案中的1个正确=0.2分(即1的20%),而不是0.25分?你的问题在哪里还不清楚。你当然知道你应该加入问题和答案。您还知道如何比较值,并且可能知道如何聚合每个用户的数据。那么你到底被困在哪里了?谢谢,我喜欢它!:)谢谢我试试看。
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;
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