Luiz,
Para você montar uma relatório que teria uma saída uma tabela cujas culnas seriam:
id firstname lastname email cidade estado curso1 curso2 curso3
A alternativa que vejo é montar duas consultas SQL e efetuar junção de dados com PHP. A lista de curso como coluna é o ponto da questão. Uma alternativa será usar subconsulta. Só que para cada curso, seria necessário uma subconsulta. Mesmo assim vejo complicação. A alernativa simplificada seria trazer todos os cursos em um coluna separado por vírgula. Neste caso a subconsulta deve implementar o comando GROUP_CONCAT.
Bem, vamos a saída que vejo mais eficiente que é montar duas consultas e formatar na hora de imprimir.
1) Consultar que gera a lista de usuários
SELECT id, firstname, lastname, email, city FROM mdl_user
Essa consulta retora a lista de usuários.
2) Consulta que gera lista de cursos de cada usuário
SELECT rs.id,rs.userid,c.id AS courseid,c.fullname AS coursefullname FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid=e.id INNER JOIN mdl_course c ON c.id=e.instanceid WHERE e.contextlevel=50
3) Formatação
Com PHP ou qualquer outra linguagem que estiver usado, gere colunas dinâmicas de curso1, curso2, etc juntando informações que retornado nas duas colunas. A chave de sincronização é id do usuário que vem na primeira consulta com userid que vem na segunda consulta.
Após montar isso, compartilhe a lógica aqui.