Преобразование скрипта MySQL в PostgreSQL приводит к ошибке «ОШИБКА: схема не существует»

#mysql #moodle

#mysql #moodle

Вопрос:

У меня есть этот запрос в MySQL, в котором перечислены все курсы Moodle, к которым был получен доступ за последние 2 года, и пользователь ( его роль в Moodle), который в последний раз обращался к нему. Я пытаюсь преобразовать его в PostgreSQL 9.3.22, чтобы он мог работать на другом Moodle LMS, который я администрирую. Однако запрос завершается ошибкой с ошибкой ERROR: schema "cat" does not exist .

Запрос MySQL:

 select cat.id 'category id',
    cat.name 'category',
    lsl.courseid,
    c.fullname 'course fullname',
    case when c.visible = '1'
      then 'yes'
      else 'no'
    end as "course visibility",
    from_unixtime(max(lsl.timecreated), '%H:%i %D %M %Y') 'lastaccessed',
    lsl.userid 'lastaccesseduserid',
    u.username 'last accessed by',
    case when r.shortname is null
        then 'user is not enrolled in this course'
        else r.shortname
    end 'role'
from prefix_logstore_standard_log lsl
    join prefix_course c on c.id = lsl.courseid
    join prefix_course_categories cat on cat.id = c.category
    join prefix_user u on u.id = lsl.userid
    left join prefix_role_assignments ra on ra.contextid = lsl.contextid -- left join in case the last accessed user wasn't enrolled in the course (i.e. admin staff).
    left join prefix_role r on r.id = ra.roleid
group by lsl.courseid
having max(lsl.timecreated) > unix_timestamp(date_sub(now(), interval 24 month))
order by lsl.courseid asc
 

Моя попытка преобразования PostgreSQL:

 select cat.id 'category id',
    cat.name 'category',
    lsl.courseid,
    c.fullname 'course fullname',
    case when c.visible = '1'
      then 'yes'
      else 'no'
    end as "course visibility",
    to_char(to_timestamp(max(lsl.timecreated)), 'HH24:MI DD/MM/YYYY') "last accessed date",
    lsl.userid 'lastaccesseduserid',
    u.username 'last accessed by',
    case when r.shortname is null
        then 'user is not enrolled in this course'
        else r.shortname 
    end "role"
from prefix_logstore_standard_log lsl
    join prefix_course c on c.id = lsl.courseid
    join prefix_course_categories cat on cat.id = c.category
    join prefix_user u on u.id = lsl.userid
    left join prefix_role_assignments ra on ra.contextid = lsl.contextid -- left join in case the last accessed user wasn't enrolled in the course (i.e. admin staff).
    left join prefix_role r on r.id = ra.roleid
group by lsl.courseid
having max(lsl.timecreated) > extract(epoch from now()- interval '2 year')
order by lsl.courseid asc
 

Я проверил схему базы данных, и таблица существует, но я не понимаю, почему эта ошибка возникает только в таблице prefix_course_categories. Я не очень хорошо знаю PostgreSQL, поэтому ваша помощь очень ценится!

Комментарии:

1. PostgreSQL не любит частичную ГРУППИРОВКУ ПО. Выполняйте агрегированные действия и фильтрацию в отдельном подзапросе.

2. Хорошо, так почему же он жалуется на таблицу prefix_course_categories, когда в этой таблице нет фильтров или агрегатных функций, выполняемых в этой таблице?

3. Возможно, потому lsl , что это самая левая таблица и courseid она уникальна (возможно, первична).