Cấp bậc tác giả:

DATABASE

Cách truy vấn các khoá học ghi danh trên moodle

Được viết bởi webmaster ngày 20/04/2020 lúc 08:56 PM
Làm thế nào để truy vấn SQL để truy xuất tất cả các sinh viên đã đăng ký vào khóa học nhất định hoặc tất cả các khóa học mà sinh viên đã đăng ký trên Moodle.
  • 0
  • 5507

Cách truy vấn các khoá học ghi danh trên moodle

Làm thế nào để truy vấn SQL để truy xuất tất cả các sinh viên đã đăng ký vào khóa học nhất định hoặc tất cả các khóa học mà sinh viên đã đăng ký trên Moodle.

Truy vấn đầu tiên cung cấp cho bạn danh sách những người dùng đã tham gia khóa học, bất kỳ vai trò nào  (có thể được đăng ký vào một khóa học và không có vai trò nào được giao).

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
Truy vấn thứ hai cho thấy tất cả người dùng có vai trò 5 được gán cho họ ở cấp khóa học. 
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
Tuy nhiên, cả hai truy vấn đều thiếu sót.

Truy vấn đầu tiên có thể trả về kết quả trùng lặp nếu người dùng đã tham gia khóa học thông qua nhiều phương thức đăng ký.
  • Plugin đăng ký có thể bị vô hiệu hóa ở cấp trang web
  • Plugin đăng ký có thể bị vô hiệu hóa ở cấp khóa học (kiểm tra 'e.status = 0' để chỉ tìm thấy các plugin đăng ký hoạt động)
  • Việc đăng ký có thể bị giới hạn thời gian - đăng ký của người dùng có thể đã hết hạn (kiểm tra 'ue.timeend = 0 HOẶC ue.timeend> NOW ()' để chỉ tìm thấy đăng ký chưa hết hạn)
Truy vấn thứ hai giả định rằng vai trò của sinh viên id là 5 (và cũng không có vai trò nào khác, dựa trên vai trò của sinh viên được sử dụng). Thông thường sử dụng một truy vấn bổ sung để kiểm tra id của vai trò 'sinh viên' trong bảng 'mdl_role' và sau đó sử dụng giá trị đó hoặc thay đổi vài dòng cuối cùng thành:

Inner join mdl_role r ON r.id = ra.roleid AND r.shortname = 'student'.

Truy vấn thứ hai cũng không kiểm tra 'context' - có thể có nhiều bối cảnh với cùng một id cá thể (vì có thể có khóa học id 5, id loại khóa 5, id người dùng 5, v.v.) - vì vậy bạn cần kiểm tra xem bối cảnh tìm thấy có phải là bối cảnh 'khóa học' không (bối cảnh = 50).

Không truy vấn nào kiểm tra người dùng bị đình chỉ hoặc người dùng bị xóa (mặc dù, trong trường hợp người dùng bị xóa, đáng lẽ họ phải tự động không bị kiểm soát khỏi tất cả các khóa học tại thời điểm họ bị xóa).

Một giải pháp hoàn chỉnh đầy đủ (có thể quá phức tạp đối với hầu hết các tình huống) sẽ kết hợp cả hai truy vấn lại với nhau để kiểm tra người dùng đã đăng ký và được giao vai trò của sinh viên và không bị đình chỉ:

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

Nguồn bài viết: DOTNET.VN

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML