我正在尝试列出学生及其测试效率。
在 MySql
数据库中,我有表
users
- 学生表
id | name
_________
1 | Joe
2 | Marry
3 | Max
4 | Anna
----------
类(class)
- 类(class)表
id | name
_____________
1 | Course 1
2 | Course 2
----------
questions
- 每门类(class)的问题表。行cours_id表示该题属于哪个类(class)
id | cours_id | question
_________________________________
1 | 1 | Course 1 - question 1
2 | 1 | Course 1 - question 2
3 | 1 | Course 1 - question 3
4 | 1 | Course 1 - question 4
5 | 2 | Course 2 - question 1
6 | 2 | Course 2 - question 2
7 | 2 | Course 2 - question 3
8 | 2 | Course 2 - question 4
cours_invitations
- 每个学生都会收到类(class)邀请。行 user_id 显示受邀参加类(class)的用户的 ID。
cours_id 表示学生应该学习的类(class)的id。
当行状态的值为 0 时,表示学生没有开始类(class)(待定),如果它的值为 1,则表示学生已经开始(或完成)。
id | user_id | cours_id | status
________________________________
1 | 1 | 1 | 1
2 | 1 | 2 | 0
3 | 2 | 1 | 0
4 | 3 | 1 | 1
5 | 4 | 1 | 1
6 | 4 | 2 | 1
示例: Joe 和 Anna 被邀请参加类(class) 1 和类(class) 2,Marry 和 Max 被邀请只参加类(class) 1。Joe 参加了类(class) 1 但没有参加类(class) 2,Marry 没有参加任何事情,Max 完成了类(class) 1
courses_stats
- 是学生完成的类(class)问题的统计数据。状态代表答案的准确性。 0 代表错误答案,1 代表正确。
id | user_id | question_id | status
___________________________________
1 | 1 | 1 | 1
2 | 1 | 2 | 1
3 | 1 | 3 | 0
4 | 2 | 1 | 1
5 | 2 | 2 | 1
6 | 2 | 3 | 1
7 | 2 | 4 | 1
8 | 4 | 1 | 1
9 | 4 | 2 | 1
10 | 4 | 3 | 0
11 | 4 | 4 | 0
12 | 4 | 5 | 1
13 | 4 | 6 | 1
示例:乔做了第一门类(class)中的 3 个问题。请注意,他没有做那门类(class)中的所有问题,那一个是不正确的。
Max 做对了所有问题,Anna 做对了第一门类(class)的所有问题(一半不正确)和第二门类(class)的一半(全部正确)
我需要查询学生姓名、已完成类(class)的百分比、他们完成的那些类(class)(不是所有类(class))的正确答案百分比以及按这些百分比对学生排序的可能性。 像这样:
name | completed courses | completed questions
______________________________________________
Max |100% |100%
Anna |100% |50%
Joe |50% |50%
Marry |0% |0%
这样的事情有可能吗?此查询是否需要表中的更多行?
最佳答案
我认为这应该是您需要的:
SELECT
users.name,
CONCAT(COUNT(
DISTINCT CASE
WHEN cours_invitations.status = 1 THEN
cours_invitations.id
ELSE
NULL
END
) / COUNT(
DISTINCT cours_invitations.id
) * 100, '%') AS completed_courses,
CONCAT(COUNT(
DISTINCT CASE
WHEN courses_stats.status = 1 THEN
courses_stats.id
ELSE
NULL
END
) / COUNT(DISTINCT questions.id) * 100, '%') AS completed_questions
FROM
users
LEFT JOIN cours_invitations ON cours_invitations.user_id = users.id
LEFT JOIN questions ON cours_invitations.cours_id = questions.cours_id
AND cours_invitations.status = 1
LEFT JOIN courses_stats ON users.id = courses_stats.user_id
GROUP BY
users.id
ORDER BY
completed_courses DESC,
completed_questions DESC
作为一个问题,为什么表名叫做 cours_*
而不是 course_*
?
关于MySql 查询 - 计算行数和百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243831/