terça-feira, 27 de julho de 2010

Extrair Lista de Nota de um Aluno no Moodle com Comando SQL

A partir da versão 1.9 do Moodle as notas ficam na tabela mdl_grade_grades. As avaliações na tabela mdl_grade_items. Para extrair uma lista com todas as avaliações feitas por um determinado aluno é necessário fazer junção da tabela como segue o código abaixo.

Código SQL para extrair a lista de nota de um aluno em um determinado curso:
SELECT i.itemname,g.finalgrade FROM mdl_grade_items i INNER JOIN mdl_grade_grades g ON i.id=g.itemid WHERE i.courseid=? AND g.userid=?

Descrição dos campos:
A consulta retorna 2 campos: i.itemname,g.finalgrade
i itemname – Nome da avaliação
g.finalgrade – Nota do a luno

Personalize os parâmetros
i.courseid=? (substitua ? por id do curso )
g.userid=? (substitua ? por id do usuário )

Esse código só exibe as avaliações feitas. As avaliações do curso que o aluno ainda não fez não serão exibidas. Para exibir todas as avaliações, mesmo as que o aluno ainda não fizer, substitua do comando SQL INNER JOIN para LEFT JOIN.
Para versão inferior a 1.9 o comando SQL deve ser outro. Houve muita alteração na tabela de nota a partir da versão 1.9 do Moodle.

15 comentários:

  1. Seria possível você criar um novo post sobre como matricular um aluno num curso, utilizando SQL?

    ResponderExcluir
  2. Segue a postagem solicitada: http://moodlesql.blogspot.com/2010/07/matricular-usuario-no-curso-do-moodle.html

    ResponderExcluir
  3. Por favor, estou com um problema em uma pesquisa feita no moodle.

    Por ex:

    adicionei esse codigo abaixo:

    select *, (select finalgrade from mdl_grade_items gi, mdl_grade_grades g where g.itemid = gi.id AND gi.courseid = c.id AND g.userid = a.id and itemtype='course') as notas from mdl_user a inner join mdl_course_display b inner join mdl_course c on a.id = b.userid and b.course = c.id where a.username like '%nome%' order by fullname

    para lista os cursos e as notas dos treinamentos que determinado usuário fez, LISTAR TODOS.

    Porém a pesquisa está adicionando alguns cursos que o aluno nao foi cadastrado, gostaria de saber como melhorar o filtro de minha pesquisa para que nao haja mais erros.

    Obrigado

    ResponderExcluir
  4. Janderson,
    Adicione no SQL a tabela de matrícula mdl_role_assignments para filtrar apenas os cursos que o aluno está inscrito.

    ResponderExcluir
  5. Query para listar nome, sobrenome, nome do item da nota e a nota final dos alunos, sendo o padrão o nome da avaliação e o id do curso.

    SELECT u.username, u.firstname, u.lastname, i.itemname, g.finalgrade
    FROM mdl_grade_items i
    INNER JOIN mdl_grade_grades g ON i.id = g.itemid
    INNER JOIN mdl_user u ON g.userid = u.id
    WHERE i.courseid =?
    AND i.itemname LIKE 'NOME DA AVALIAÇÃO'
    LIMIT 0 , 10000

    ResponderExcluir
  6. Teria como eu fazer um relatório com todas as notas de um aluno em todos os cursos?

    ResponderExcluir
    Respostas
    1. Tamires,
      Para montar a lista de nota de um aluno em todos os cursos, basta usar o mesmo código que está no post, porém tirar curso do WHERE e colocar no SELECT. Com essa modificação, o comando ficará assim:

      SELECT i.courseid,i.itemname,g.finalgrade FROM mdl_grade_items i INNER JOIN mdl_grade_grades g ON i.id=g.itemid WHERE g.userid=?

      Excluir
  7. Como pegar se o usuário foi aprovado ou não no curso?

    ResponderExcluir
  8. Precisava da média do curso para saber se foi aprovado ou não

    ResponderExcluir
    Respostas
    1. Anaconda,
      Para extrair a média da nota final de um determinado curso, execute o seguinte comando SQL:

      SELECT AVG(g.finalgrade) FROM mdl_grade_grades g INNER JOIN mdl_grade_items i ON g.itemid=i.id WHERE i.itemtype='course' AND i.courseid=?

      Passe o parâmetro id do curso em i.courseid=?

      Se o critério de aprovação for nota final >=7, por exemplo, execute o comando abaixo para listar a relação dos alunos aprovados com base nesse critério:

      SELECT u.id, u.firstname,u.lastname,u.email, g.finalgrade FROM mdl_grade_grades g INNER JOIN mdl_grade_items i ON g.itemid=i.id INNER JOIN mdl_user u ON u.id=g.userid WHERE i.itemtype='course' AND g.finalgrade>=7 AND i.courseid=?

      Passe o parâmetro id do curso em i.courseid=?

      Você pode automatizar esse processo usando a ferramenta externa ao Moodle. Dê uma olhada nesse link: http://gmoodle.blogspot.com.br/2014/04/sistema-badiu-gmoodle.html

      Excluir
  9. Olá, como eu poderia extrair apenas a média final do curso?
    No comando desse post ele seleciona todas as atividades, inclusive a média. No itemname da pesquisa o valor é NULL e este é a média pelo que percebi...

    ResponderExcluir
    Respostas
    1. Quero dizer a média final de um aluno no curso...

      Excluir
    2. mysql> select id, userid, itemid, finalgrade from mdl_grade_grades;
      +----+--------+--------+------------+
      | id | userid | itemid | finalgrade |
      +----+--------+--------+------------+
      | 1 | 3 | 2 | 1.00000 |
      | 2 | 3 | 3 | 10.00000 |
      | 3 | 3 | 4 | 7.00000 |
      | 4 | 3 | 1 | NULL |
      +----+--------+--------+------------+


      mysql> select userid, avg(finalgrade) from mdl_grade_grades where finalgrade is not null group by userid;
      +--------+-----------------+
      | userid | avg(finalgrade) |
      +--------+-----------------+
      | 3 | 6.000000000 |
      +--------+-----------------+

      Junta com a tabela de usuários e a de cursos e coloca elas nas colunas e agrupamento.

      Somente não consegui relacionar com a tabela de turmas.

      Excluir
  10. Uma pergunta: O meu curso tem mais de uma turma. Como relacionar isso com a nota, sabendo que um aluno pode ser avalidado em turmas distintas uma vez que pode haver reprovação ?

    ResponderExcluir