Moodle课程注册的SQL查询
我正在探求恰当的SQL查询来检索在某个课程中注册的全部门生,可能某个门生在Moodle上注册的全部课程. 我从互联网上找到了一些办理方案,个中大大都提议插手这些表: 可是当我查察数据库时,我发明有一个名为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的全部用户.有也许(固然不通俗)在课程级别分派一个脚色,而不是现实上在课程自己中. 可是,这两个查询都存在缺陷. 假如用户通过多种注册要领在课程中插手,则第一个查询也许会返回一再的功效(不通俗,但也许).它也没有思量到以下身分: >可以在站点级别禁用注册插件 第二个查询假定门生脚色是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 (留意我没有细心搜查该查询 – 它运行,但你必要细心交错引用现实的注册,以搜查我没有错过任何对象). (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |