您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

对Moodle课程注册的SQL查询

对Moodle课程注册的SQL查询

一个查询为您提供了已注册课程的用户列表,无论他们已分配给他们什么角色(有可能已注册课程而根本没有分配任何角色)。

第二个查询显示在课程级别为其分配了角色5的所有用户。可以(尽管不寻常)在课程级别分配角色,而无需实际注册课程本身。

但是,这两个查询都是有缺陷的。

如果用户通过一种以上的注册方法注册了课程,则第一个查询可能返回重复的结果(不常见,但可能)。它还没有考虑以下因素:

第二个查询假定学生角色为id 5(并且基于该学生角色,没有其他正在使用的角色)。我通常会使用一个额外的查询来检查表’mdl_role’中’student’角色的ID,然后使用该值,或者将最后几行更改为以下内容

加入mdl_role r ON r.id = ra.roleid和r.shortname =’student’。

第二个查询也无法检查’contextlevel’-可能有多个具有相同实例ID的上下文(因为可能具有课程ID 5,课程类别ID 5,用户ID 5等)-因此您需要检查找到的上下文是“课程”上下文(contextlevel = 50)。

查询既不会检查已暂停的用户,也不会检查已删除用户(尽管对于已删除用户,应该在删除它们时自动将它们从所有课程中取消注册)。

一个完整的解决方案(在大多数情况下可能过于复杂)会将两个查询组合在一起以检查用户是否已注册并分配了学生角色而不是被暂停:

SELECT DISTINCT u.id AS userid, c.id AS courseid
FROM mdl_user u
JOIN mdl_user_enrolments ue ON ue.userid = u.id
JOIN mdl_enrol e ON e.id = ue.enrolid
JOIN mdl_role_assignments ra ON ra.userid = u.id
JOIN mdl_context ct ON ct.id = ra.contextid AND ct.contextlevel = 50
JOIN mdl_course c ON c.id = ct.instanceid AND e.courseid = c.id
JOIN mdl_role r ON r.id = ra.roleid AND r.shortname = 'student'
WHERE e.status = 0 AND u.suspended = 0 AND u.deleted = 0
  AND (ue.timeend = 0 OR ue.timeend > UNIX_TIMESTAMP(Now())) AND ue.status = 0

(请注意,我没有对查询进行广泛的检查-它可以运行,但是您需要仔细对照实际的注册进行交叉引用,以检查我没有错过任何内容)。

SQLServer 2022/1/1 18:32:00 有444人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶