Jump to content

Ganhe $$$ escrevendo tutoriais para nós!


Foto

Vários counts em uma consulta

banco de dados mysql count




  • Faça login para responder
13 respostas neste tópico

#1 bichopapao

bichopapao
  • Participante
  • 30 mensagens

Publicado 20 February 2012 - 02:45 AM

Ola pessoal,
estou tentando fazer uma consulta em um banco mysql e estou tendo uma dificultado, juntar vários counts,

e o seguinte, tenho um banco de faltas de alunos. o aluno recebe a falta por aula, esta aula esta relacionada a uma disciplina, um professor e turma.

preciso retornar o nome do aluno e a quantidade de falta que ele tem em cada uma das disciplinas (cod_disc_prof_turma)

estou enviando uma imagem, mostrando mais ou menos como sao minhas tabelas. abaixo da linha vermelha, é como eu gostaria que a consulta ao banco retornasse...

com esse código eu consegui o subtotal de cada disc_prof_turma, mas, o nome do aluno aparece várias vezes e o total em uma coluna, preciso que apareca apenas uma vez o nome do aluno e varias colunas com o total de falta de cada disc_prof_turma


SELECT COUNT( b.cod_falta ) AS tot_faltas, a. * , b. * , c . * , ttt. *
FROM tb_alunos a
LEFT JOIN tb_faltas b ON a.cod_aluno = b.cod_aluno
LEFT JOIN tb_aulas c ON b.cod_aula = c.cod_aula
LEFT JOIN (
SELECT t. * , COUNT( t.cod_falta )
FROM tb_faltas t
GROUP BY cod_aluno
) AS ttt ON a.cod_aluno = ttt.cod_aluno
WHERE a.cod_turma =2
GROUP BY a.cod_aluno, c.cod_disc_prof_turma
ORDER BY a.aluno
LIMIT 0 , 100

.
.

Posted Image

Editado por bichopapao, 20 February 2012 - 02:50 AM.
''

Porque o avião não é construido com o mesmo material da caixa preta?




#2 nickosoft

nickosoft

    Hardware Expert

  • Colaborador
  • 3378 mensagens

Publicado 20 February 2012 - 09:02 AM

o problema do nome aparecer N vezes, pode estar no select *, se definir os campos, pode ser q resolva
VB.Net & C#

#3 bichopapao

bichopapao
  • Participante
  • 30 mensagens

Publicado 20 February 2012 - 10:51 AM

Bom, peço desculpas pela confusão, na verdade tenho o padrão, mas errei na hora de digitar o nome da tabela.

Realmente meu desenho no excel ficou incompleto, achei que não fosse necessário colocar todas as tabelas, então coloquei só as envolvidas na consulta em questão

a maior confusão pode estar na tabela disc_prof_turma, que é uma relação de professores, com turmas e disciplinas

Veja bem, um professor pode dar aulas de duas ou mais disciplinas, para várias turmas ou para uma mesma turma

(por exemplo: professor JOÃO dá aula de ALGORITMOS, BANCO DE DADOS e também de SISTEMAS OPERACIONAIS... ele trabalha com essas disciplinas para alunos das turmas 1, 2, 3, 4, 5... portando, o mesmo professor, tem várias disciplinas e várias turmas)

Dessa maneira, quando o aluno recebe uma falta, essa falta e cadastrada na tabela faltas, que tem a seguinte estrutura. Lembrando que fiz isso, pois cada falta vem devidamente acompanhada da aula, assim, sei exatamente em que dia o aluno faltou e em que aula ele faltou

cod_falta / cod_aluno / cod_aula
1 3 2


o aluno recebeu uma falta em uma aula (aula 2)

essa aula de código 2 está relacionada em outra tabela, a tabela aulas...

cod_aula / data_aula / cod_disc_prof_turma
2 15/2/2012 3


o cod_disc_prof_turma indica qual o professor, a disciplina e a turma daquela aula... que por sua vez estãoo relacionados da seguinte maneira

cod_disc_prof_turma / cod_prof / cod_disc / cod_turma
3 1 3 5


a falta então esta computada para o aluno 3. podemos entao dizer que o aluno 3, da turma 5, tem 1 falta com o professor 1, na disciplina 3, que ele recebeu na aula 2, que aconteceu no dia 15/2/2012


quanto ao relacionamento, eles so existem na hora da consulta, não sei fazer no phpmyadmin o que eu fazia por exemplo no access... la eu relacionava as tabelas e uma ficava ligada a outra por esse relacionamento.
aqui, o relacionamento existe apenas 'na minha cabeça' e junto essas tabelas no select.

veja um que conseguia agora de manha, so acho que ficará muito extenso, pois se uma turma tiver por exemplo 10 disciplinas, terei que repetir o trecho do código 10 vezes...


SELECT a.cod_aluno, a.aluno, ttt. * , zzzz1.tt_disc_1, zzzz2.tt_disc_2,zzzz1.cod_aluno
FROM tb_alunos a
LEFT JOIN (

SELECT t.cod_aluno, COUNT( t.cod_falta )
FROM tb_faltas t
GROUP BY cod_aluno
) AS ttt ON a.cod_aluno = ttt.cod_aluno

LEFT JOIN (
SELECT COUNT( zzz1.cod_falta ) AS tt_disc_1, zzz1.cod_aula, zzz1.cod_aluno, c.cod_disc_prof_turma
FROM tb_faltas zzz1
INNER JOIN tb_aulas c ON zzz1.cod_aula = c.cod_aula
where c.cod_disc_prof_turma=11
GROUP BY zzz1.cod_aluno, c.cod_disc_prof_turma
) AS zzzz1 ON a.cod_aluno = zzzz1.cod_aluno


LEFT JOIN (
SELECT COUNT( zzz2.cod_falta ) AS tt_disc_2, zzz2.cod_aula, zzz2.cod_aluno, c.cod_disc_prof_turma
FROM tb_faltas zzz2
INNER JOIN tb_aulas c ON zzz2.cod_aula = c.cod_aula
where c.cod_disc_prof_turma=3
GROUP BY zzz2.cod_aluno, c.cod_disc_prof_turma
) AS zzzz2 ON a.cod_aluno = zzzz2.cod_aluno




WHERE a.cod_turma =2
GROUP BY a.cod_aluno
ORDER BY a.aluno
LIMIT 0 , 100

Porque o avião não é construido com o mesmo material da caixa preta?

#4 nickosoft

nickosoft

    Hardware Expert

  • Colaborador
  • 3378 mensagens

Publicado 21 February 2012 - 12:31 PM

nao uso o php, mas atraves de chaves primarias e estrangueiras, você criar a relacao de tabelas, e ja elimina problema de inconsistencia ;) ou pelo menos dificulta
o pior q é uma desgraca entender tudo isso, pq cada um tem uma logica hehehe
VB.Net & C#

#5 bichopapao

bichopapao
  • Participante
  • 30 mensagens

Publicado 21 February 2012 - 01:09 PM

o que preciso é um retorno parecido com a segunda imagem...
com o codigo abaixo conseegui, mas se for precisar somar dez colunas o codigo ficara enorme



SELECT a.cod_aluno, a.aluno, ttt. * , zzzz1.tt_disc_1, zzzz2.tt_disc_2,zzzz1.cod_aluno
FROM tb_alunos a
LEFT JOIN (

SELECT t.cod_aluno, COUNT( t.cod_falta ) 
FROM tb_faltas t
GROUP BY cod_aluno
) AS ttt ON a.cod_aluno = ttt.cod_aluno

LEFT JOIN (
SELECT COUNT( zzz1.cod_falta ) AS tt_disc_1, zzz1.cod_aula, zzz1.cod_aluno, c.cod_disc_prof_turma
FROM tb_faltas zzz1
INNER JOIN tb_aulas c ON zzz1.cod_aula = c.cod_aula
where c.cod_disc_prof_turma=11
GROUP BY zzz1.cod_aluno, c.cod_disc_prof_turma
) AS zzzz1 ON a.cod_aluno = zzzz1.cod_aluno 


LEFT JOIN (
SELECT COUNT( zzz2.cod_falta ) AS tt_disc_2, zzz2.cod_aula, zzz2.cod_aluno, c.cod_disc_prof_turma
FROM tb_faltas zzz2
INNER JOIN tb_aulas c ON zzz2.cod_aula = c.cod_aula
where c.cod_disc_prof_turma=3
GROUP BY zzz2.cod_aluno, c.cod_disc_prof_turma
) AS zzzz2 ON a.cod_aluno = zzzz2.cod_aluno




WHERE a.cod_turma =2
GROUP BY a.cod_aluno
ORDER BY a.aluno
LIMIT 0 , 100


Posted Image

veja o retorno que desejo
Posted Image
Porque o avião não é construido com o mesmo material da caixa preta?

#6 bichopapao

bichopapao
  • Participante
  • 30 mensagens

Publicado 22 February 2012 - 11:56 PM

Preciso que o php retorne na tela algo parecido com a imagem abaixo... acontece que tem turma que as disciplinas são diferentes... e o banco tem que ver isso no relacionamento de prof_disc_turma
Posted Image
Porque o avião não é construido com o mesmo material da caixa preta?

#7 nickosoft

nickosoft

    Hardware Expert

  • Colaborador
  • 3378 mensagens

Publicado 23 February 2012 - 05:09 AM

a solucao vai ser você criar toda essa query aos poucos pra descobrir onde esta o erro
comece por algo simples, faca um inner join entre tbalunos e tbfaltas, ai depois inclua tbaulas, va seguindo o caminho dos relacionamentos para chegar até onde estao computadas as faltas....apesar q olhei olhei e ainda nao sei onde se define presente ou ausente no banco
VB.Net & C#

#8 MarcosBorsa

MarcosBorsa
  • Participante
  • 631 mensagens

Publicado 23 February 2012 - 07:28 AM

>> bichopapao

Para cada SELECT cod_aluno ele vai exibir uma coluna com essa informação. Na sua tabela "retorno que desejo" consta isso também. Se conseguir fazer a busca sem usar mais de uma vez o cod_aluno no SELECT pode ser que consiga obter o resultado que deseja.

>> nickosoft

Pelo que entendi, o sistema vai gerenciar isso pela existência de um dado na tabela tb_faltas relacionado à tabela tb_alunos e a data da aula poderá ser obtida relacionando essas tabelas à "tb_aulas". Não vi outra maneira.

#9 bichopapao

bichopapao
  • Participante
  • 30 mensagens

Publicado 23 February 2012 - 08:00 AM

A questão MarcosBorsa, é que nessa tabela que eu postei ai, "retorno que desejo", mostro o total de faltas (contando na tabela tb_faltas) para cada uma das disciplinas (na tabela tb_faltas não tem a disciplina... tem a aula,, que esta relacionada a uma disciplina).
So que eu fiz, definindo as disciplinas...
O que preciso e que a busca me retorne todas as disciplinas e uma determinada turma (cada turma tem uma quantidade de disciplina diferente), com o total de faltas em cada uma delas.
consegui repetindo varias vezes o inner join, mas o codigo fica extenso e não tem como prever quantas disciplinas a turma tera, do jeito que fiz foi manual...

no outro codigo que postei consegui aproximar do que eu queria, mas o nome do aluno esta repetindo... fica mais ou menos assim
cod	  aluno	   disc_prof_turma		   tt_falta
1		joao------------- 3 -------------   2
2		maria------------ 3  -------------  4
3		maria------------ 9  -------------  1
entao maria tem 3 faltas no cod_disc_prof_turma=3, e 1 falta no cod_disc_prof_turma=9

na busca isso retorna em duas linhas...
talvez teria como mostrar isso em colunas
obrigado!

Editado por bichopapao, 23 February 2012 - 08:02 AM.
''

Porque o avião não é construido com o mesmo material da caixa preta?

#10 nickosoft

nickosoft

    Hardware Expert

  • Colaborador
  • 3378 mensagens

Publicado 23 February 2012 - 10:33 AM

isso não tem algo parecido com o manager studio?
la você pode escrever a query e imediatamente ver o retorno

achei algo interessante q pode ser util
Select OrderId, Sum(UnitPrice) SumPrice
From Order_Details
Group By OrderId

Posted Image
ai tem q ver as adaptacoes ao seu caso
VB.Net & C#






Tópicos Relacionados Collapse


Tópicos com palavra-chave: banco de dados, mysql, count





Ganhe $$$ escrevendo tutoriais para nós!