A sacada na verdade é que ele está repetindo a matrícula pela quantidade de respostas de cada exercício. Uma query que vai te ajudar a ver é essa aqui que imprime o id do exercicio e da resposta:
select a.nome, m.id, e.id, r.id from resposta r
join exercicio e on e.id = r.exercicio_id
join secao s on s.id = e.secao_id
join curso c on c.id = s.curso_id
join matricula m on m.curso_id = c.id
join aluno a on a.id = m.aluno_id
Note que de fato vão ter vários registros que terão o mesmo par nome e id de matrícula, mas o que vai mudar neles é o id do exercício e das respostas. E quando fazemos o group by pelo nome do aluno e fazemos simplesmente o count(m.id)
ele não está contando quantas matrículas de ids diferentes tem, mas sim o total de m.id que vai ser igual a essa quantidade de exercícios diferentes que tem no curso.
Por exemplo, vamos supor que as suas tabelas estão assim:
Aluno
id nome
1 João
Matricula
id aluno_id curso_id
1 1 7
Curso
id nome
7 sql
Secao
id curso_id
10 7
Exercicio
id secao_id
20 10
21 10
22 10
Resposta
id exercicio_id
30 20
31 21
32 22
A query lá de cima daria este resultado:
a.nome m.id e.id r.id
João 1 20 30
João 1 21 31
João 1 22 32
E se eu simplesmente fizer um group by em a.nome
e count(m.id)
, ele mostraria que João e 3, porque de fato tem 3 linhas com ids de matrículas.
Agr se eu fizer count(distinct m.id)
ai sim vai dar apenas 1, pois só tem 1 id aparecendo na coluna inteira para o João.