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