#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
она уникальна (возможно, первична).