MySql 查询 - 计算行数和百分比

标签 mysql count left-join percentage cross-join

我正在尝试列出学生及其测试效率。 在 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/

相关文章:

php - 查询2表连接

mysql - 查找不重复的部门名称和位置

MySQL统计结果集中列值的变化

python - 谷歌应用引擎 : how to count a database's entries beyond 1000?

android - 计算 sd 卡中的图像

mysql - 合并和求和 SQL 数据库中的数据

mysql - 计数不适用于 LEFT Join

mysql - 在 MySQL 多对多表中获取唯一成员资格

php - 如何确定表单数据何时已成功输入数据库?

sql - 在 MySQL 中查找缺失值