Ir para conteúdo

POWERED BY:

Arquivado

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

José Gomes Colhado Neto

[Resolvido] Pesquisa MYSQL PHP

Recommended Posts

Boa noite, pessoal.

 

Eu tenho uma tabela chamada FINANCEIRO com os seguintes campos: id, idaluno e horas_concluidas (o qual é registrado com "sim" pelo sistema caso esse aluno (identificado pelo idaluno) consuma todas as horas de seu pacote.

 

Assim, esse mesmo aluno (idaluno) poderá ter varios registros nesta tabela.

 

Estou tentando fazer um relatório que identifique quais idaluno já possuem o "sim" no campo horas concluidas e não possuem outro registro nesta tabela.

 

Este relatório vai poder identificar quais alunos a escola vai oferecer a compra de novos pacotes de horas.

 

Eu sei fazer consultas simples no MYSQL e PHP, mas não sei o que colocar depois do WHERE para pesquisar os registros de todos os idaluno desta tabela o qual todos seus registros estão com "sim" no campo horas concluidas.

 

Meu código até agora é esse:

 

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, nome FROM cadastro_pessoas WHERE cadastro_pessoas.id IN (SELECT financeiro.idaluno FROM financeiro WHERE horas_concluidas = 'sim') AND tipo_pessoa='aluno' AND grupoid='220' ORDER by nome");
//$resultadoalunosempacote = mysql_query("SELECT cadastro_pessoas.id,cadastro_pessoas.nome,financeiro.idaluno FROM financeiro INNER JOIN cadastro_pessoas ON financeiro.idaluno != cadastro_pessoas.id");
$i=1;
while($linha = mysql_fetch_array($resultalunosconcluidos)){
$nomes = $linha['nome'];
echo $i++ . ": " . $nomes;
echo "<br>";
}

                      ?>

 

este código exibe os nomes das pessoas que já encerraram, mas não sei como fazer para que eles não aparecam caso seja adquirido novo pacote de horas.

 

Obrigado,

Compartilhar este post


Link para o post
Compartilhar em outros sites

WHERE horas_concluidas = 'sim'

?

É o seguinte: nesta tabela constam todos os pacotes de horas adquiridos por todos os alunos. Quando o sistema identifica que o aluno já consumiu aquele pacote de horas, ele grava como "sim" em horas_concluidas.

Então, o aluno compra outro pacote de horas, e quando é concluido, ele grava "sim" novamente... Ou seja, o aluno pode ter vários registros neta tabela, mas sempre com o mesmo número no campo idaluno.

 

O que eu preciso é que seja identificado estes alunos (idaluno) em que todos os outros registros dele nesta tabela já estejam marcados com "sim" no campo horas_concluídas.

 

Será que tem como me ajudar? Tenho que entergar este sistema hoje e não sei como fazer....

Valewww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, facilitaria se você trocasse esse campo 'sim' por um valor booleano, com 0 para 'não' e 1 para 'sim'.

Aí você poderia fazer:

SELECT cadastro_pessoas.id, nome FROM cadastro_pessoas WHERE cadastro_pessoas.id IN 
(SELECT financeiro.idaluno FROM financeiro WHERE SUM(horas_concluidas) = COUNT(horas_concluidas) GROUP BY financeiro.idaluno) AND tipo_pessoa='aluno' AND grupoid='220' ORDER by nome

Não tenho certeza se funciona, pois não estou certo se posso usar esse COUNT aí, mas tenta...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo o que eu entendi, você quis somar todos os campo do horas_concluidas para que seja verificado se igual a contagem de todos os registros?

Se for isso, não adianta... é que nesta tabelea tem diversos alunos, e não somente um, (a não ser que fosse somados e contatos somente em relação à determinados registros - por exemplo, todos os idaluno = 12.

 

E de qualquer forma, esse sisteminha tem diversas páginas, eu teria que alterar todas elas por conta da alteração na tabela....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, acho que pelo group by ele vai agrupar pelo aluno na hora de contar, verifica aí...

 

Meu código ficou assim:

 

 <?        

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, nome FROM cadastro_pessoas WHERE cadastro_pessoas.id IN (SELECT financeiro.idaluno FROM financeiro WHERE horas_concluidas = '') AND tipo_pessoa='aluno' AND grupoid='220' GROUP BY 'financeiro.idaluno' ORDER by nome");
$i=1;
while($linha = mysql_fetch_array($resultalunosconcluidos)){
$nomes = $linha['nome'];
echo $i++ . ": " . $nomes;
echo "<br>";
}

                      ?>

 

Ele continuou exibindo o registro de uma pessoa que já adquiriu um outro pacote (pois o primeiro já estava marcado como sim ).

tentei por sem o '', mas acaba dando erro. tentei também só com 'idaluno', mas continuou o problema...

 

Então, acho que pelo group by ele vai agrupar pelo aluno na hora de contar, verifica aí...

 

Então, fiz a alteração como você falou (no BD e no código).

 

mas está dando erro:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/onthewayid/public_html/sistema/verpessoasmain.php on line 137

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, consegui aqui. Criei uma estrutura parecida com a sua e cheguei na solução final:

SELECT c.id, c.nome, COUNT(f.id) AS total_cursadas, SUM(f.concluida) AS total_concluidas FROM cadastro_pessoas c 
INNER JOIN financeiro f ON (c.id = f.idaluno) WHERE c.tipo_pessoa='aluno' AND c.grupoid='220' GROUP BY f.idaluno 
HAVING total_concluidas = total_cursadas ORDER by c.nome

 

Não tenho a estrutura inteira da sua tabela, talvez você precise alterar alguma coisa. O segredo é esse group by com esse having aí...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, consegui aqui. Criei uma estrutura parecida com a sua e cheguei na solução final:

SELECT c.id, c.nome, COUNT(f.id) AS total_cursadas, SUM(f.concluida) AS total_concluidas FROM cadastro_pessoas c 
INNER JOIN financeiro f ON (c.id = f.idaluno) WHERE c.tipo_pessoa='aluno' AND c.grupoid='220' GROUP BY f.idaluno 
HAVING total_concluidas = total_cursadas ORDER by c.nome

 

Não tenho a estrutura inteira da sua tabela, talvez você precise alterar alguma coisa. O segredo é esse group by com esse having aí...

Bacana cara....

valew mesmo!

 

Se você estivesse em Curitiba te pagava uma cerveja :)

 

Vou tentar aqui. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testa aí e me fala, tenho 99,99% de certeza que vai te resolver.

Bom é que com essa sua dúvida, eu acabei aprendendo como se faz isso também, não sabia ao certo como fazer.

It's a WIN-WIN o/...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testa aí e me fala, tenho 99,99% de certeza que vai te resolver.

Bom é que com essa sua dúvida, eu acabei aprendendo como se faz isso também, não sabia ao certo como fazer.

It's a WIN-WIN o/...

 

Só me explica uma coisa, já que até hoje nao aprendi a usar INNER JOIN:

 

SELECT c.id, c.nome, COUNT(f.id) AS total_cursadas, SUM(f.concluida) AS total_concluidas FROM cadastro_pessoas c

INNER JOIN financeiro f ON (c.id = f.idaluno) WHERE c.tipo_pessoa='aluno' AND c.grupoid='220' GROUP BY f.idaluno

HAVING total_concluidas = total_cursadas ORDER by c.nome

 

ESSE C.ID C.NOME f.idaluno . o que são esses C´s e f´s ? e o AS total_cursadas é um apelido?

Eu tenho que substituir o c. por cadastro_pessoas e f. por financeiro?

 

Não consigo... continua dando msg de erro:

 

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, cadastro_pessoas.nome, COUNT(financeiro.id) AS total_cursadas, SUM(financeiro.concluida) AS total_concluidas FROM cadastro_pessoas cadastro_pessoas INNER JOIN financeiro f ON (cadastro_pessoas.id = financeiro.idaluno) WHERE cadastro_pessoas.tipo_pessoa='aluno' AND cadastro_pessoas.grupoid='220' GROUP BY financeiro.idaluno HAVING total_concluidas = total_cursadas ORDER by cadastro_pessoas.nome");        
$i=1;
while($linha = mysql_fetch_array($resultalunosconcluidos)){
$nomes = $linha['nome'];
echo $i++ . ": " . $nomes;
echo "<br>";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma vez que você definiu o alias (apelido) pra tabela, é só utilizá-lo, não precisa usar o nome inteiro da tabela. Facilita pra você escrever menos.

Faz assim:

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, cadastro_pessoas.nome, COUNT(financeiro.id) AS total_cursadas, SUM(financeiro.concluida) 
AS total_concluidas FROM cadastro_pessoas cadastro_pessoas INNER JOIN financeiro f ON (cadastro_pessoas.id = financeiro.idaluno) 
WHERE cadastro_pessoas.tipo_pessoa='aluno' AND cadastro_pessoas.grupoid='220' 
GROUP BY financeiro.idaluno HAVING total_concluidas = total_cursadas ORDER by cadastro_pessoas.nome") or die(mysql_error());        

Veja se mostra algum erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma vez que você definiu o alias (apelido) pra tabela, é só utilizá-lo, não precisa usar o nome inteiro da tabela. Facilita pra você escrever menos.

Faz assim:

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, cadastro_pessoas.nome, COUNT(financeiro.id) AS total_cursadas, SUM(financeiro.concluida) 
AS total_concluidas FROM cadastro_pessoas cadastro_pessoas INNER JOIN financeiro f ON (cadastro_pessoas.id = financeiro.idaluno) 
WHERE cadastro_pessoas.tipo_pessoa='aluno' AND cadastro_pessoas.grupoid='220' 
GROUP BY financeiro.idaluno HAVING total_concluidas = total_cursadas ORDER by cadastro_pessoas.nome") or die(mysql_error());        

Veja se mostra algum erro.

mostrou: Unknown column 'financeiro.idaluno' in 'field list'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta:

SELECT cadastro_pessoas.id, cadastro_pessoas.nome, financeiro.idaluno, COUNT(financeiro.id) AS total_cursadas, SUM(financeiro.concluida) 
AS total_concluidas FROM cadastro_pessoas cadastro_pessoas INNER JOIN financeiro f ON (cadastro_pessoas.id = financeiro.idaluno) 
WHERE cadastro_pessoas.tipo_pessoa='aluno' AND cadastro_pessoas.grupoid='220' 
GROUP BY financeiro.idaluno HAVING total_concluidas = total_cursadas ORDER by cadastro_pessoas.nome

Compartilhar este post


Link para o post
Compartilhar em outros sites

o código ficou assim:

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, cadastro_pessoas.nome, COUNT(financeiro.idaluno) AS total_cursadas, SUM(financeiro.horas_concluidas) AS total_concluidas FROM cadastro_pessoas cadastro_pessoas INNER JOIN financeiro f ON (cadastro_pessoas.id = financeiro.idaluno) WHERE cadastro_pessoas.tipo_pessoa='aluno' AND cadastro_pessoas.grupoid='220' GROUP BY financeiro.idaluno HAVING total_concluidas = total_cursadas ORDER by cadastro_pessoas.nome") or die(mysql_error());        

$i=1;
while($linha = mysql_fetch_array($resultalunosconcluidos)){
$nomes = $linha['nome'];
echo $i++ . ": " . $nomes;
echo "<br>";
}

 

Desculpa.. não tinha visto o post anterior.

 

Agora deu o erro Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/onthewayid/public_html/sistema/verpessoasmain.php on line 142

 

Meu código ficou assim:

 

$resultalunosconcluidos = mysql_query("SELECT cadastro_pessoas.id, cadastro_pessoas.nome, financeiro.idaluno, COUNT(financeiro.idaluno) AS total_cursadas, SUM(financeiro.horas_concluidas) 
AS total_concluidas FROM cadastro_pessoas cadastro_pessoas INNER JOIN financeiro f ON (cadastro_pessoas.id = financeiro.idaluno) 
WHERE cadastro_pessoas.tipo_pessoa='aluno' AND cadastro_pessoas.grupoid='220' 
GROUP BY financeiro.idaluno HAVING total_concluidas = total_cursadas ORDER by cadastro_pessoas.nome");        

$i=1;
while($linha = mysql_fetch_array($resultalunosconcluidos)){
$nomes = $linha['nome'];
echo $i++ . ": " . $nomes;
echo "<br>";
}

 

Eu estou alterando concluida por horas_concluidas e outros detalhes...

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.