加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Moodle课程注册的SQL查询

发布时间:2021-04-01 19:50:02 所属栏目:编程 来源:网络整理
导读:我正在探求恰当的SQL查询来检索在某个课程中注册的全部门生,可能某个门生在Moodle上注册的全部课程. 我从互联网上找到了一些办理方案,个中大大都提议插手这些表: context,role_assignments,course,user,role 可是当我查察数据库时,我发明有一个名为user_enro

我正在探求恰当的SQL查询来检索在某个课程中注册的全部门生,可能某个门生在Moodle上注册的全部课程.

我从互联网上找到了一些办理方案,个中大大都提议插手这些表:
context,role_assignments,course,user,role

可是当我查察数据库时,我发明有一个名为user_enrolments的表,在我看来,我可以通过插手以下表来得到功效:
user_enrolments,用户,课程,注册

譬喻,

SELECT u.id,c.id
FROM mdl_user u
INNER JOIN mdl_user_enrolments ue ON ue.userid = u.id
INNER JOIN mdl_enrol e ON e.id = ue.enrolid
INNER JOIN mdl_course c ON e.courseid = c.id

SELECT u.id,c.id
FROM mdl_user u
INNER JOIN mdl_role_assignments ra ON ra.userid = u.id
INNER JOIN mdl_context ct ON ct.id = ra.contextid
INNER JOIN mdl_course c ON c.id = ct.instanceid
INNER JOIN mdl_role r ON r.id = ra.roleid
WHERE r.id = 5

(个中5是脚色门生的id)

这两个查询为我提供了沟通的功效集. (仅在一小组数据上测试)

以是我想问一下这两种要领有什么区别?
感激您提前得到任何辅佐.

办理要领

第一个查询为您提供了在课程中插手的用户列表,他们分派给他们的任何脚色(可以在课程中插手课程而且基础没有分派任何脚色).

第二个查询表现在课程级别为其分派了脚色5的全部用户.有也许(固然不通俗)在课程级别分派一个脚色,而不是现实上在课程自己中.

可是,这两个查询都存在缺陷.

假如用户通过多种注册要领在课程中插手,则第一个查询也许会返回一再的功效(不通俗,但也许).它也没有思量到以下身分:

>可以在站点级别禁用注册插件
>可以在课程级别禁用注册插件(搜查’e.status = 0’以仅查找勾当的注册插件)
>注册也许偶然刻限定 – 用户的注册也许已逾期(搜查’ue.timeend = 0或ue.timeend> NOW()’以仅查找未逾期的注册)

第二个查询假定门生脚色是id 5(而且尚有没有其他脚色,基于门生脚色,正在行使中).我凡是会行使特另外查询来搜查表’mdl_role’中’student’脚色的id,然后行使该值,可能将最后几行变动为以下内容:

JOIN mdl_role r ON r.id = ra.roleid AND 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 > NOW()) AND ue.status = 0

(留意我没有细心搜查该查询 – 它运行,但你必要细心交错引用现实的注册,以搜查我没有错过任何对象).

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读