Moodle SQL: вопрос относительно объединения двух таблиц - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь написать SQL-запрос в Moodle, который показывает мне, когда студент зарегистрировался, а также завершил определенный курс.Если Дата завершения равна нулю, то предполагается, что студент не закончил курс.Это тот тип данных, которые я хочу получить.Это то, что у меня есть:

SELECT u.lastname, u.firstname, u.username, c.fullname, 
FROM_UNIXTIME(cx.timecompleted) as "Completion Date",Null as "Enrol_Time"

FROM prefix_course_completions as cx
JOIN prefix_course as c on cx.course = c.id
Join prefix_user as u on cx.userid = u.id

Where cx.timecompleted is not null

and c.fullname like "%refresh%"

union 

SELECT u.lastname, u.firstname, u.username, c.fullname, 
FROM_UNIXTIME(cc.timecompleted) as "Completion Date", Null as "Enrol_Time"

From prefix_local_recompletion_cc_cc as cc
JOIN prefix_course as c on cc.course = c.id
Join prefix_user as u on cc.userid = u.id

and c.fullname like "%refresh%"

Where cc.timecompleted IS NOT NULL

union 

SELECT u.lastname, u.firstname, u.username, co.fullname, Null as "Completion 
Date",

FROM_UNIXTIME(ra.timemodified,'%D %M %h:%i:%s %x') AS enrol_time FROM 
prefix_role_assignments ra, 
prefix_user u, prefix_context c, prefix_course co
WHERE ra.contextid = c.id AND c.contextlevel = 50 AND ra.userid = u.id AND 
c.instanceid = co.id AND ra.timemodified >0

and co.fullname like "%refresh%"

order by "Completion Date" DESC

Приведенный выше запрос дает мне все необходимые данные (имя студента, название курса, дата зачисления / завершения).Однако в том виде, как оно есть, Дата регистрации и Дата завершения находятся в отдельных строках.

Есть ли у кого-нибудь какие-либо советы / идеи относительно того, как я могу получить Даты зачисления и завершения в одном ряду таблицы?Я предполагаю, что это какой-то запрос JOIN, но я не уверен.

Любая помощь будет принята с благодарностью.Спасибо.

1 Ответ

0 голосов
/ 22 декабря 2018

Примерно так будет перечисляться зарегистрированных пользователей и их статус завершения.

SELECT c.id AS courseid, c.fullname AS coursename,
    u.id AS userid, u.firstname, u.lastname,
    e.enrol AS enrolmethod, ue.timecreated AS timeenrolled,
    cc.timecompleted,
CASE
    WHEN cc.status = 10 THEN 'Not yet started'
    WHEN cc.status = 25 THEN 'In progress'
    WHEN cc.status = 50 THEN 'Completed'
    WHEN cc.status = 75 THEN 'Completed via Record of Prior Learning'
    ELSE 'Unknown'
END AS completionstatus
FROM mdl_course c
JOIN mdl_enrol e ON e.courseid = c.id
JOIN mdl_user_enrolments ue ON ue.enrolid = e.id
JOIN mdl_user u ON u.id = ue.userid
JOIN mdl_course_completions cc ON cc.course = c.id AND cc.userid = u.id

Обратите внимание, что пользователь может быть зачислен на курс, используя более одного метода регистрации, поэтому может быть несколько строк дляПользователь.Также у пользователя может быть запись о завершении, но он был исключен из курса, поэтому он не будет включен.Поэтому, возможно, измените соединение на:

FROM mdl_course c
JOIN mdl_course_completions cc ON cc.course = c.id
JOIN mdl_user u ON u.id = cc.userid
LEFT JOIN (
    SELECT ue.userid, e.courseid, MIN(ue.timecreated) AS timecreated
    FROM mdl_enrol e
    JOIN mdl_user_enrolments ue ON ue.enrolid = e.id
    GROUP BY ue.userid, e.courseid
) ue ON ue.userid = u.id AND ue.courseid = c.id
...