Это возможно в sql? Мудл - PullRequest
       11

Это возможно в sql? Мудл

0 голосов
/ 24 апреля 2020

Привет, я делаю проект в Moodle и у меня есть вопрос, возможно ли это вообще. У меня есть эти 3 запроса, которые я пытаюсь вложить в один.

    select c.fullname, count(1) as total from {role_assignments} ra INNER JOIN 
    {logstore_standard_log}  as lsl ON ra.userid = lsl.userid  
    INNER JOIN {course} as c on lsl.courseid =c.id 
    WHERE  lsl.action="viewed" and lsl.target = "course" GROUP BY c.fullname



       select c.fullname, count(1) as student from {role_assignments} ra INNER JOIN 
       {logstore_standard_log}  as lsl ON ra.userid = lsl.userid  
       INNER JOIN {course} as c on lsl.courseid =c.id 
       WHERE ra.roleid=5 AND lsl.action="viewed" and lsl.target = "course" GROUP BY c.fullname


   select c.fullname, count(1) as rest from {role_assignments} ra INNER JOIN 
   {logstore_standard_log}  as lsl ON ra.userid = lsl.userid  
   INNER JOIN {course} as c on lsl.courseid =c.id 
   WHERE ra.roleid!=5 AND lsl.action="viewed" and lsl.target = "course" GROUP BY c.fullname

Из того, что я видел, это, вероятно, можно сделать с помощью подзапросов, но я не могу найти способ сделать это.

Desired result

Спасибо за любая помощь

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Это можно сделать одним запросом.

SELECT lsl.courseid, c.fullname,
     COUNT(*) as total,
     SUM(CASE WHEN ra.roleid = 5 THEN 1 ELSE 0 END) as student,
     SUM(CASE WHEN ra.roleid <> 5 THEN 1 ELSE 0 END) as rest
FROM mdl_logstore_standard_log as lsl
JOIN mdl_role_assignments ra ON ra.userid = lsl.userid  
JOIN mdl_course AS c ON c.id = lsl.courseid
WHERE lsl.action = 'viewed' AND lsl.target = 'course'
GROUP BY lsl.courseid, c.fullname

Хотя пользователь может иметь более одной роли в курсе, поэтому столбцы total и rest будут искажены.

Вам также следует группировать данные по курсу, потому что могут быть повторяющиеся названия курсов.

0 голосов
/ 24 апреля 2020

Если все ваши запросы имеют одинаковый формат вывода, вы можете использовать UNION

select c.fullname, count(1) as total, NULL as student, null as rest from {role_assignments} ra INNER JOIN 
{logstore_standard_log}  as lsl ON ra.userid = lsl.userid  
INNER JOIN {course} as c on lsl.courseid =c.id 
WHERE  lsl.action="viewed" and lsl.target = "course" GROUP BY c.fullname

UNION

select c.fullname, null, count(1) as student, null from {role_assignments} ra INNER JOIN 
{logstore_standard_log}  as lsl ON ra.userid = lsl.userid  
INNER JOIN {course} as c on lsl.courseid =c.id 
WHERE ra.roleid=5 AND lsl.action="viewed" and lsl.target = "course" GROUP BY 
  c.fullname

UNION

select c.fullname, null, null, count(1) as rest from {role_assignments} ra INNER JOIN 
{logstore_standard_log}  as lsl ON ra.userid = lsl.userid  
INNER JOIN {course} as c on lsl.courseid =c.id 
WHERE ra.roleid!=5 AND lsl.action="viewed" and lsl.target = "course" GROUP BY    
 c.fullname

PS: обратите внимание на select part

...