Sql

14 respostas
ricardocomp

Olá pessoal, eu estou precisando fazer uma consulta em SQL para selecionar o melhor aluno
de um curso e não estou conseguindo, pois aluno e disciplina é um relacionamento n:m.

Será que alguém poderia me dar uma ajuda?

[]'s.

14 Respostas

ricardocomp

Eu queria fazer uma consulta em SQL dado um curso qual o melhor aluno desse curso,

o aluno que tiver a maior média escolar (notas) nas disciplinas será o melhor aluno do curso.

Eu resumi um pouco a base de dados para caber aqui.

Será que alguém poderia me dar uma ajuda?

[]'s.

romarcio

O melhor aluno de um curso ou de uma disciplina?
Pergunto por que você não tem aluno vinculado a um curso e sim a disciplinas.
Tem que consultar qual melhor aluno de uma disciplina e depois ver qual curso essa disciplina pertence.

A

cara,

fiz um consulta, mas deu para testar, mas ve te ajuda

select a.nome, d.nome, max(ad.nota)
from aluno a
  join aluno_disciplina ad on (a.idUsuario = ad.idUsuario)
  join disciplina d on (ad.idDisciplina = d.idDisciplina)
  join curso c on (d.idCurso = c.idCurso)
where c.nome = ?
group by a.nome, d.nome
order by a.nome, d.nome

t+

ricardocomp

Olá Alisson e romarcio eu fiz um teste aqui com a consulta

select a.nome, d.nome, max(ad.nota) from aluno a
join aluno_disciplina ad on (a.idUsuario = ad.idUsuario)
join disciplina d on (ad.idDisciplina = d.idDisciplina)
join curso c on (d.idCurso = c.idCurso)
where c.nome = 'Bacharelado em Informática' group by a.nome, d.nome order by a.nome, d.nome;

Porém o MySQL retorna a seguinte mensagem

Unknown column 'a.nome' in 'field list'

Será que vc Alisson e romarcio ou alguém poderia me dar uma ajuda?

[]'s.

A

rsrs,
to vendo na sua tabela ai e sua tabela aluno nao tem nome, mas vc pode substituir por qualquer coluna na sua tabela.

t+

romarcio

Na tabela aluno não tem coluna nome. Troca nome por matricula.

ricardocomp

Olá Alisson e romarcio eu coloquei um curso que já tenho alunos e disciplinas e notas tudo populado porém a consulta
me retorna apenas os campos matricula, nome e max(ad.nota) sem nenhum resultado

select a.matricula_nusp, d.nome, max(ad.nota) from aluno a
join aluno_disciplina ad on (a.idUsuario = ad.idUsuario)
join disciplina d on (ad.idDisciplina = d.idDisciplina)
join curso c on (d.curso_idcurso = c.idCurso)
where c.nome = 'Bacharelado em Ciência da Computação'
group by a.matricula_nusp, d.nome order by a.matricula_nusp, d.nome;

O que será que está errado com essa consuta que não retorna nenhum resultado apenas os campos em branco?

Será que vc Alisson e Romarcio ou alguém poderia me dar uma ajuda?

[]'s.

A

cara,

faz assim

select a.matricula_nusp, d.nome, max(ad.nota) from aluno a  
join aluno_disciplina ad on (a.idUsuario = ad.idUsuario)  
join disciplina d on (ad.idDisciplina = d.idDisciplina)  
join curso c on (d.curso_idcurso = c.idCurso)  
where lower(c.nome) like 'bacharelado%'  
group by a.matricula_nusp, d.nome order by a.matricula_nusp, d.nome;

t+

romarcio

O nome do curso está correto? Exatamente como o cadastrado no banco?

ricardocomp

Olá Alisson e Romarcio o nome estava errado,
Alisson e Romarcio mas pensando no que vocês me falaram
como seria uma consulta para pegar o melhor aluno de uma disciplina,
o aluno que tirou a maior nota na disciplina?

[]'s.

A

cara,

essa consulta que eu te passei, faz isso, so que vc tem que colocar o nome do aluno na tabela aluno.

t+

E

vou dar uma sugestão:

select idusuario, avg(nota) as avg_nota
  from aluno_disciplina
  group by idusuario
  order by avg(nota) desc
  limit 0,1

Não testei, dá uma olhada aí. Também não lembro a sintaxe do limit, faz tempo que não mexo com mysql.

Edit: as consultas dos outros posts desse tópico, pelo que eu vi, pega a maior nota de cada aluno dentre as disciplinas.

ricardocomp

Oi pessoal, na verdade eu estou precisando implementar o seguinte método

public List<Aluno> getMelhorAluno(Integer idDisciplina) throws ExcecaoDAO {
       EntityManager em = JPAUtil.getInstance().getEntityManager();
       try {
           Query query = em.createQuery("Select a.idusuario, max(b.nota) "
                   + "from aluno a , aluno_disciplina b where a.idusuario = "
                   + "b.idusuario AND b.iddisciplina = " + idDisciplina);
           return query.getResultList();
       } catch (Exception e) {
           throw new ExcecaoDAO(DisciplinaDAO.class.getSimpleName().toString()
                   + " :: Erro ao listar os dados!");
       } finally {
           em.close();
       }
   }

Porém estou em dúvida na hora de retornar query.getResultList()
pois eu preciso retornar o id do aluno juntamente com a sua nota
e dessa forma com essa consulta eu já consigo pegar o melhor aluno de
uma disciplina.

Será que teria como alguém me dar uma ajdua nesse método?

[]'s.

E

Essa consulta do último post, creio que vai dar erro, falta o group by. Seria legal colocar o order by também.

Acho que para trazer um único resultado, o getSingleResult resolve seu problema, se não me engano ele vai retornar um array de 2 objetos, em que o primeiro elemento é o id, e o segundo a nota. Se usar o getResultList vai trazer um List de array de objetos.

Tentou usar a consulta que te passei? Não te serviu?

Criado 26 de outubro de 2011
Ultima resposta 26 de out. de 2011
Respostas 14
Participantes 4