Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

edison.silva

PHP + SQL - Somar Faltas do Aluno

Recommended Posts

Tenho uma uma tabela no MYSQL onde gravo as faltas ou presenças do alunos como S ou N Exemplo: aula1 = S aula2 = S aula3 = N aula4 = S aula5 = N preciso percorre esta tabela para somar quantas faltas ou presenças teve tal aluno. não faço a menor ideia para fazer este select, alguma sugestão? segue a estrutura da tabela.

CREATE TABLE IF NOT EXISTS `curso_mat` (
  `curso` int(10) unsigned NOT NULL,
  `aluno` int(10) unsigned NOT NULL,
  `ano` int(4) unsigned NOT NULL,
  `nota1` float NOT NULL,
  `nota2` float NOT NULL,
  `nota3` float NOT NULL,
  `nota4` float NOT NULL,
  `nota5` float NOT NULL,
  `nota10` float NOT NULL,
  `notafinal` float NOT NULL,
  `valor` float NOT NULL,
  `aula1` varchar(1) NOT NULL,
  `aula2` varchar(1) NOT NULL,
  `aula3` varchar(1) NOT NULL,
  `aula4` varchar(1) NOT NULL,
  `aula5` varchar(1) NOT NULL,
  PRIMARY KEY (`curso`,`aluno`,`ano`)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara se você mudasse essa tabela já te ajudaria muito, daria para você dividir ela e não deixar todas as informações juntas.

Exemplo:

 

Crie uma tabela Cursos, Alunos e Faltas

 

Na tabela Cursos você colocaria todas as informações relevantes dos cursos, lembrando de criar o ID_CURSO.

Na tabela Alunos você iria vinculas o ID_CURSO com um aluno, e aqui você já teria um campos faltas com o total de faltas, aqui também deve ter um ID_ALUNO.

Na tabela Faltas seria o log de faltas do aluno, você iria saber o dia que ele faltou por exemplo, mais lembre de vincular os dados com o ID_ALUNO.

 

 

Lembrando que essa tabela serve se o aluno for fazer um único curso, caso ele possa fazer mais de um curso na instituição você só precisa arrumar algumas coisas. Caso você não entenda alguma coisa é só perguntar :closedeyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara se você mudasse essa tabela já te ajudaria muito, daria para você dividir ela e não deixar todas as informações juntas.

Exemplo:

 

Crie uma tabela Cursos, Alunos e Faltas

 

Na tabela Cursos você colocaria todas as informações relevantes dos cursos, lembrando de criar o ID_CURSO.

Na tabela Alunos você iria vinculas o ID_CURSO com um aluno, e aqui você já teria um campos faltas com o total de faltas, aqui também deve ter um ID_ALUNO.

Na tabela Faltas seria o log de faltas do aluno, você iria saber o dia que ele faltou por exemplo, mais lembre de vincular os dados com o ID_ALUNO.

 

 

Lembrando que essa tabela serve se o aluno for fazer um único curso, caso ele possa fazer mais de um curso na instituição você só precisa arrumar algumas coisas. Caso você não entenda alguma coisa é só perguntar :closedeyes:

Obrigado pela resposta..

eu entendi o que você disse, mas, o problemas é que meu chefe quer a tabela com esta estrutura..

só preciso somar as faltas e presenças onde as aulas estão como S ou N armazenar em uma variavel para depois calcular conforme regra é isso que não estou conseguindo fazer..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta..

eu entendi o que você disse, mas, o problemas é que meu chefe quer a tabela com esta estrutura..

só preciso somar as faltas e presenças onde as aulas estão como S ou N armazenar em uma variavel para depois calcular conforme regra é isso que não estou conseguindo fazer..

 

Meu Deus, se o seu chefe quer assim ele não tem a minima ideia do que esta fazendo rs

Poste aqui no fórum o código que você esta usando para fazer o select na tabela ? Você esta usando PDO ?

 

Apos você ter feito o select na tabela, ele retorna no formato de array ai fica simples o manuseio do mesmo :innocent:

Você já usou array alguma vez ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, a estrutura da sua tabela dificulta um pouco as coisas.

 

Se você quiser somar as faltas de um aluno em determinado ano (independente do curso), isto atenderia:

SELECT
aluno,
ano,
(SELECT COUNT(aula1) FROM curso_mat a1 WHERE curso.aluno = a1.aluno AND curso.ano = a1.ano AND a1.aula1 = 'N') as faltas_aula1,
(SELECT COUNT(aula2) FROM curso_mat a2 WHERE curso.aluno = a2.aluno AND curso.ano = a2.ano AND a2.aula2 = 'N') as faltas_aula2,
(SELECT COUNT(aula3) FROM curso_mat a3 WHERE curso.aluno = a3.aluno AND curso.ano = a3.ano AND a3.aula3 = 'N') as faltas_aula3,
(SELECT COUNT(aula4) FROM curso_mat a4 WHERE curso.aluno = a4.aluno AND curso.ano = a4.ano AND a4.aula4 = 'N') as faltas_aula4,
(SELECT COUNT(aula5) FROM curso_mat a5 WHERE curso.aluno = a5.aluno AND curso.ano = a5.ano AND a5.aula5 = 'N') as faltas_aula5
FROM
curso_mat curso
GROUP BY
aluno,
ano

Pode também, usar PHP:

 

<?php

// SELECT * FROM curso_mat WHERE aluno = 1 AND curso = 1

$faltas = 0;
while($dados  ...): // loop fetch_array
    // pra cada aula que o aluno tiver
    for($i = 1; $i <= 5; $i++):
        if($dados['aula'.$i] == 'N'):
            $faltas += 1;
        endif;
    endfor;
endwhile;

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aproveitando a pergunta do colega, como faria para exibir os dados da coluna count em um formulário?

 

No select, precisa dar um alias pro campo:

COUNT(*) as total

No PHP, para exibir depois de jogar o retorno do select para uma variável:

echo $variavel['total'];

No caso da minha resposta ali de cima, não há um alias para o COUNT(*) por que não precisa, visto que o há um alias para o resultado do select todo (faltas_aula1, faltas_aula2...)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu vejo de uma forma diferente, faça da seguinte forma :

SELECT aula1, aula2, aula3, aula4, aula5 FROM curso_mat; // WHERE aluno = ""; (Isso se voce quiser cada registro com o nome do aluno);  

Exemplo de como ele vai retorno no PHP com uma de 1 registro

 

Array(
[0] => Array (

[aula1] => 'N'

[aula2] => 'S'

[aula3] => 'N'

[aula4] => 'S'

[aula5] => 'N'

)
[1] => Array (

[aula1] => 'N'

[aula2] => 'S'

[aula3] => 'S'

[aula4] => 'S'

[aula5] => 'S'

)
)

$total = 0;
foreach ($dados as $chave => $valor ){
   foreach ($dados[$chave] as $falta ){
       if ($falta != 'S'){
       $total +=1;
       }
   }
}

obs: Não testei o codigo, qualquer problema é so falar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas, pelo que eu entendi, estes campos terão apenas "S" e "N", e não o número de faltas.

 

Mesmo do seu jeito, precisaria do PHP para somar depois.

<?php

// SELECT * FROM curso_mat WHERE aluno = 1 AND curso = 1

$faltas = 0;
while($dados  ...): // loop fetch_array
    // pra cada aula que o aluno tiver
    for($i = 1; $i <= 5; $i++):
        if($dados['aula'.$i] == 'N'):
            $faltas += 1;
        endif;
    endfor;
endwhile;

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Correto, por isso eu verifico se o valor é S, caso não for ele soma 1 na variável total, que é referente ao total de faltas daquela aluno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Correto, por isso eu verifico se o valor é S, caso não for ele soma 1 na variável total, que é referente ao total de faltas daquela aluno.

 

Exato. Havia postado novamente o código PHP porque sua resposta tinha sido carregada pela metade aqui, parava no array().

Agora vejo ela completa.

 

 

 

 

Também dá pra resolver em um SQL monstruoso:

SELECT
	aluno,
	curso, 
	ano, 
	SUM(falta_aula1+falta_aula2+falta_aula3+falta_aula4+falta_aula5) as faltas
FROM 
	(
	SELECT 
		aluno,
		curso,
		ano,
		(SELECT CASE aula1 WHEN 'N' THEN 1 ELSE 0 END as aula1 FROM curso_mat a1 WHERE a1.aluno = curso.aluno AND a1.curso = curso.curso AND a1.ano = curso.ano) as falta_aula1,
		(SELECT CASE aula2 WHEN 'N' THEN 1 ELSE 0 END as aula2 FROM curso_mat a2 WHERE a2.aluno = curso.aluno AND a2.curso = curso.curso AND a2.ano = curso.ano) as falta_aula2,
		(SELECT CASE aula3 WHEN 'N' THEN 1 ELSE 0 END as aula3 FROM curso_mat a3 WHERE a3.aluno = curso.aluno AND a3.curso = curso.curso AND a3.ano = curso.ano) as falta_aula3,
		(SELECT CASE aula4 WHEN 'N' THEN 1 ELSE 0 END as aula4 FROM curso_mat a4 WHERE a4.aluno = curso.aluno AND a4.curso = curso.curso AND a4.ano = curso.ano) as falta_aula4,
		(SELECT CASE aula5 WHEN 'N' THEN 1 ELSE 0 END as aula5 FROM curso_mat a5 WHERE a5.aluno = curso.aluno AND a5.curso = curso.curso AND a5.ano = curso.ano) as falta_aula5
	FROM
		curso_mat curso
	) as aluno_curso

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Realmente, a estrutura da sua tabela dificulta um pouco as coisas.

 

Se você quiser somar as faltas de um aluno em determinado ano (independente do curso), isto atenderia:

SELECT
aluno,
ano,
(SELECT COUNT(aula1) FROM curso_mat a1 WHERE curso.aluno = a1.aluno AND curso.ano = a1.ano AND a1.aula1 = 'N') as faltas_aula1,
(SELECT COUNT(aula2) FROM curso_mat a2 WHERE curso.aluno = a2.aluno AND curso.ano = a2.ano AND a2.aula2 = 'N') as faltas_aula2,
(SELECT COUNT(aula3) FROM curso_mat a3 WHERE curso.aluno = a3.aluno AND curso.ano = a3.ano AND a3.aula3 = 'N') as faltas_aula3,
(SELECT COUNT(aula4) FROM curso_mat a4 WHERE curso.aluno = a4.aluno AND curso.ano = a4.ano AND a4.aula4 = 'N') as faltas_aula4,
(SELECT COUNT(aula5) FROM curso_mat a5 WHERE curso.aluno = a5.aluno AND curso.ano = a5.ano AND a5.aula5 = 'N') as faltas_aula5
FROM
curso_mat curso
GROUP BY
aluno,
ano

Pode também, usar PHP:

<?php

// SELECT * FROM curso_mat WHERE aluno = 1 AND curso = 1

$faltas = 0;
while($dados  ...): // loop fetch_array
    // pra cada aula que o aluno tiver
    for($i = 1; $i <= 5; $i++):
        if($dados['aula'.$i] == 'N'):
            $faltas += 1;
        endif;
    endfor;
endwhile;

?>

Pessoal obrigado pela a atenção de todos..

 

estou implementando o exemplo do Diego que neste caso é o que esta sendo ideal para mil.

 

Diego fez conforme o seu exemplo, mas a cada passada dor for ele incrementa mais 1, até ai tudo bem, o problemas é que esta pegando o total das presenças o somando com a presença do proximo aluno, exemplo

 

Anderson Presença = 4

Barbosa = Presença = 7

 

codigo do meu sql:

 $sql = ("select m.aluno, a.nome as alunonome, m.nota1, m.nota2, m.nota3, m.nota4, m.nota5, 
  m.nota6, m.nota7, m.nota8,  m.nota9, m.nota10, m.notaFinal, m.aula1, m.aula2, m.aula3, m.aula4, m.aula5, m.aula6,
  m.aula7, m.aula8, m.aula9, m.aula10 ");
  $sql .= ("from curso_mat m, alunos a ");
  $sql .= ("where a.id = m.aluno ");
  $sql .= (" and m.curso = $curso ");	
  $sql .= ("order by a.nome");
  
  $res = mysql_query($sql);

<?php
 // $i=0;
  echo( '<tr>
    		<td colspan="23"><b>'.strtoupper($row['3']).'</b></td>
  		</tr>' );
	$faltas = 0;
  while($row = mysql_fetch_array($res)) {
    // pra cada aula que o aluno tiver
    for($i = 1; $i <= 10; $i++){
        if($row['aula'.$i] == 'S'){
            $faltas += 1;
		}
	}
  	$cor = zebraTable($i);
	echo('
			<tr>
				<td bgcolor='.$cor.'><center style="font-size:12">'.$row['1'].'</td>//nome do aluno
				<td bgcolor='.$cor.'><center style="font-size:12">'.$row['aula1'].'</td>
				<td bgcolor='.$cor.'><center style="font-size:12">'.$row['aula2'].'</td>
				<td bgcolor='.$cor.'><center style="font-size:12">'.$row['aula3'].'</td>
				<td bgcolor='.$cor.'><center style="font-size:12">'.$row['aula4'].'</td>
				<td bgcolor='.$cor.'><center style="font-size:12">'.$row['aula5'].'</td>
                       </tr>
			
		');
          }
	
?>

Resultado no Excel:

Nome	     Aula 1	  Aulas 2	Aulas 3	Aulas 4	Aulas 5	Presenças
ANDERSO       N 	     N	         S	   N	    S	     2
BARBOSA	      S	             S		 N         N        N        4
CARLOS	      S	             S	         S	   S	    S	     9
JOSE 	      S	             N	         S	   N	    S	     12
JOSÉFINA      S	             S	         S	   S	    S	     17

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta voce zera o contador depois, mudando o $faltas de lugar.

<?php


while($dados  ...): // loop fetch_array
    $faltas = 0;
    // pra cada aula que o aluno tiver
    for($i = 1; $i <= 5; $i++):
        if($dados['aula'.$i] == 'N'):
            $faltas += 1;
        endif;
    endfor;
endwhile;

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Basta voce zera o contador depois, mudando o $faltas de lugar.

<?php


while($dados  ...): // loop fetch_array
    $faltas = 0;
    // pra cada aula que o aluno tiver
    for($i = 1; $i <= 5; $i++):
        if($dados['aula'.$i] == 'N'):
            $faltas += 1;
        endif;
    endfor;
endwhile;

?>

Viiiniii era isso mesmo, eu estava zerando o contador antes do while..

valeu, problema resolvido!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.