A partir da versão mais recente, se não me engano a partir de 3.8, foi adicionado compos do perfil do curso.
Segue alguns comandos SQL para consultar campos do perfil:
Lista os campos de pefil dos cursos
SELECT d.id,d.instanceid AS courseid,f.name AS fieldname,f.shortname AS fieldkey,d.value,d.charvalue FROM mdl_customfield_data d INNER JOIN mdl_customfield_field f ON f.id=d.fieldid
Lista os campos de pefil dos cursos consultando por uma determinada chave e valor
SELECT d.id,d.instanceid AS courseid,f.name AS fieldname,f.shortname AS fieldkey,d.value,d.charvalue FROM mdl_customfield_data d INNER JOIN mdl_customfield_field f ON f.id=d.fieldid WHERE f.shortname=? AND d.charvalue LIKE '?%'
Passe o parâmetro (string) shortname do campo em f.shortname=?
Passe o parâmetro (string) valor do campo em d.charvalue LIKE '?%'
Consulta id do curso pela chave a valor do compo
SELECT d.instanceid AS courseid FROM mdl_customfield_data d INNER JOIN mdl_customfield_field f ON f.id=d.fieldid WHERE f.shortname=? AND d.charvalue =?
Passe o parâmetro (string) shortname do campo em f.shortname=?
Passe o parâmetro (string) valor do campo em d.charvalue =?
Consulta total de registro id do curso e chave do campo
SELECT COUNT(d.instanceid) AS countrecord FROM mdl_customfield_data d INNER JOIN mdl_customfield_field f ON f.id=d.fieldid WHERE f.shortname=? AND d.charvalue =?
Passe o parâmetro (string) shortname do campo em f.shortname=?
Passe o parâmetro (string) valor do campo em d.charvalue =?
Consulta valor do campo pelo id do curso e chave do campo
SELECT d.value FROM mdl_customfield_data d INNER JOIN mdl_customfield_field f ON f.id=d.fieldid WHERE f.shortname=? AND d.instanceid =?
Passe o parâmetro (string) shortname do campo em f.shortname=?
Passe o parâmetro (int) id do curso em d.instanceid =?
Consulta id do curso pela chave a valor do compo