Боритесь, чтобы сделать правильный запрос к таблице базы данных Moodle "mdl_logstore_standard_log", чтобы экспортировать журналы, как это происходит из графического интерфейса

Моя проблема в том, что я пытаюсь экспортировать CSV-файл из базы данных Moodle "mdl_logstore_standard_log" с точным порядком, указанным на странице журналов в разделе Администрирование сайта> Отчеты.

Порядок полей отчета Moodle с графическим интерфейсом

Одна из идей для достижения этой цели заключается в следующем запросе:

SELECT 
FROM_UNIXTIME(l.timecreated,'%d %b, %H:%i') AS `Time`,
CONCAT(u.firstname, ' ', u.lastname) AS `User full name`,
CONCAT(au.firstname, ' ', au.lastname) AS `Affected user`,
l.origin AS `Origin`,
l.ip AS `IP address`
FROM mdl_logstore_standard_log AS l
LEFT JOIN mdl_user AS u ON u.id = l.userid
LEFT JOIN mdl_user AS au ON au.id = l.relateduserid

К сожалению, запрос выше не ведет себя так, как я ожидаю. Мне нужны точные данные из отчета GUI Moodle. Есть ли идея, если этот запрос уже реализован в php-файле в Moodle или кто-то пробовал это раньше?

1 ответ

Решение

Веб-форма использует не один запрос, а серию запросов и код PHP для создания отчета журнала. Если вам интересно, я зарегистрировал две такие серии здесь: сегодняшние журналы и все журналы.

Большинство запросов в журнале посвящены разрешениям на просмотр и т. Д. Основная часть находится в конце, начиная примерно здесь:

SELECT COUNT('x') FROM mdl_course
SELECT id,shortname,fullname,category FROM mdl_course   ORDER BY fullname
SELECT u.id, u.firstnamephonetic,u.lastnamephonetic,u.middlename,u.alternatename,u.firstname,u.lastname
              FROM mdl_user u
              JOIN (SELECT DISTINCT eu1_u.id
              FROM mdl_user eu1_u                
             WHERE 1 = 1 AND eu1_u.deleted = 0) je ON je.id = u.id
             WHERE u.deleted = 0 ORDER BY u.lastname, u.firstname, u.id LIMIT 0, 1001
SELECT COUNT('x') FROM mdl_logstore_standard_log WHERE anonymous = 0
SELECT * FROM mdl_logstore_standard_log WHERE anonymous = 0 ORDER BY timecreated DESC, id DESC LIMIT 0, 100
SELECT id,firstnamephonetic,lastnamephonetic,middlename,alternatename,firstname,lastname FROM mdl_user WHERE id = '2'
SELECT * FROM mdl_logstore_standard_log WHERE anonymous = 0 ORDER BY timecreated DESC, id DESC LIMIT 0, 100
SELECT * FROM mdl_user WHERE id = '2' AND deleted = '0'

Вот и все. В общем, вы делаете это правильно. Тем не менее, вам нужно красиво распечатать остальные столбцы, а именно contextid, component, eventname, а также other, сам:

SELECT FROM_UNIXTIME(l.timecreated, '%d %b, %H:%i') AS `Time`
    ,CONCAT (u.firstname, ' ', u.lastname) AS `User FULL name`
    ,CONCAT (au.firstname, ,' ', au.lastname) AS `Affected user`
    ,l.contextid AS EventContext
    ,l.component
    ,l.eventname
    ,other AS description
    ,l.origin AS `Origin`
    ,l.ip AS `IP address`
FROM mdl_logstore_standard_log AS l
LEFT JOIN mdl_user AS u ON u.id = l.userid
LEFT JOIN mdl_user AS au ON au.id = l.relateduserid
WHERE l.anonymous = 0
ORDER BY l.timecreated DESC
    ,l.id DESC

Если это как-то связано с автоматизацией, а не просто с отчетами, я бы воздержался от утомительного перевода и просто работал с необработанными данными, выбранными здесь.

Другие вопросы по тегам