Ir para conteúdo

POWERED BY:

Arquivado

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

valdir calixto

[Resolvido] Agrupar por um campo e trazer resultados na tela

Recommended Posts

Boa tarde amigos minha dúvida é a seguinte tenho uma tabela aonde cadastro avaliações físicas feitas pelos meus alunos, ou seja um aluno pode ter mais de uma avaliação, quero criar um busca no qual digito o cpf do aluno ai me aparece os dados de todas as avaliações feitas por ele, como peso, massa muscular, idade e etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde amigos minha dúvida é a seguinte tenho uma tabela aonde cadastro avaliações físicas feitas pelos meus alunos, ou seja um aluno pode ter mais de uma avaliação, quero criar um busca no qual digito o cpf do aluno ai me aparece os dados de todas as avaliações feitas por ele, como peso, massa muscular, idade e etc.

 

Bom...

 

Tabela de alunos:

mysql> create table `alunos` (
    -> `id` mediumint(8) unsigned not null auto_increment,
    -> `cpf` varchar(14) not null,                        
    -> `nome` varchar(60) not null,                       
    -> `nascimento` date not null,                    
    -> primary key(`id`),
    -> key `cpf`(`cpf`),
    -> key `nascimento`(`nascimento`)                 
    -> ) engine=MyISAM; 
Query OK, 0 rows affected (0.00 sec)

Tabela de avaliações:

mysql> create table `avaliacoes`(
    -> `id` mediumint(8) unsigned not null auto_increment,
    -> `data` timestamp not null default current_timestamp,
    -> `peso` smallint(3) not null,
    -> `massa` smallint(3) not null,
    -> `aluno` mediumint(8) unsigned not null,
    -> primary key(`id`,`aluno`),
    -> key `data`(`aluno`,`data`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)

Inserindo alguns registros:

mysql> insert into alunos(`cpf`,`nome`,`nascimento`) values('000.000.000-00','Neto',date('1981-09-05')),('111.111.111-11','Joao',date('2009-07-23'));
 Query OK, 2 rows affected (0.00 sec)
 Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into avaliacoes(`peso`,`massa`,`aluno`) values(56,1,1),(56,2,2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

Conferindo:

 

mysql> select * from alunos;
+----+----------------+------+------------+
| id | cpf            | nome | nascimento |
+----+----------------+------+------------+
|  1 | 000.000.000-00 | Neto | 1981-09-05 |
|  2 | 111.111.111-11 | Joao | 2009-07-23 |
+----+----------------+------+------------+
2 rows in set (0.00 sec)

mysql> select * from avaliacoes;
+----+---------------------+------+-------+-------+
| id | data                | peso | massa | aluno |
+----+---------------------+------+-------+-------+
|  1 | 2009-07-23 17:25:40 |   56 |     1 |     1 |
|  2 | 2009-07-23 17:25:40 |   56 |     2 |     2 |
+----+---------------------+------+-------+-------+
2 rows in set (0.00 sec)

Agora que temos a tabela de alunos e a tabela de avaliações, basta utilizarmos a relação entre elas:

mysql> select
    ->     av.data,
    ->     av.peso,
    ->     av.massa,
    ->     al.nome,
    ->     al.nascimento
    -> from
    ->     avaliacoes av
    -> join
    ->     alunos al
    -> on
    ->     al.id = av.aluno
    -> where
    ->     al.cpf = '000.000.000-00';
+---------------------+------+-------+------+------------+
| data                | peso | massa | nome | nascimento |
+---------------------+------+-------+------+------------+
| 2009-07-23 17:25:40 |   56 |     1 | Neto | 1981-09-05 |
+---------------------+------+-------+------+------------+
1 row in set (0.00 sec)

Inserindo mais um registro para confirmar:

 

mysql> insert into avaliacoes(`peso`,`massa`,`aluno`) values(56,2,1);
Query OK, 1 row affected (0.00 sec)

Verificando:

 

mysql> select
    ->     av.data,
    ->     av.peso,
    ->     av.massa,
    ->     al.nome,
    ->     al.nascimento
    -> from
    ->     avaliacoes av
    -> join
    ->     alunos al
    -> on
    ->     al.id = av.aluno
    -> where
    ->     al.cpf = '000.000.000-00';
+---------------------+------+-------+------+------------+
| data                | peso | massa | nome | nascimento |
+---------------------+------+-------+------+------------+
| 2009-07-23 17:25:40 |   56 |     1 | Neto | 1981-09-05 |
| 2009-07-23 17:29:38 |   56 |     2 | Neto | 1981-09-05 |
+---------------------+------+-------+------+------------+
2 rows in set (0.00 sec)

Agora no PHP é igual a uma consulta qualquer:

 

$cpf = "000.000.000-00"; //aqui vai o CPF do aluno
$qstr = <<<SQL
select
    av.data,
    av.peso,
    av.massa,
    al.nome,
    al.nascimento
from
    avaliacoes av
join
    alunos al
on
    al.id = av.aluno
where
    al.cpf = '%s';
SQL;

if ( ( $res = mysql_query( sprintf( $qstr , $cpf ) ) ) ){
    while ( ( $row = mysql_fetch_array( $res , MYSQL_ASSOC ) ) ){
        printf( "%s\n"                , $row[ "data" ] );
        printf( "nome: %s\n"        , $row[ "nome" ] );
        printf( "nascimento: %s\n"    , $row[ "nascimento" ] );
        printf( "Peso: %s\n"        , $row[ "peso" ] );
        printf( "massa: %s\n"        , $row[ "massa" ] );
    }
    
    mysql_free_result( $res );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então a questão é que eu já tenho a tabela avaliação nela já constam os campos nome e cpf, massa, idade, só quero agrupar e mostrar todos o resultados referente ao cpf do aluno, pois eu consigo consultar individualmente cada consulta, pois é criado um registro novo para cada uma exemplo:

 

CPF: 8790.88777.00999

Avaliação1: 09/09/2009

Massa muscular: 90

Peso: 89

Altura: 1,87

Idade: 20 anos

 

Avaliação2: 09/10/2009

Massa muscular: 80

Peso: 78

Altura: 1,87

Idade: 20 anos

 

Avaliação 3: 09/11/2009

Massa musuclar: 88

Peso: 80

Altura: 1,87

Idade: 20 ano

 

Desta forma que preciso, já tenho a tabela pronto com todos os campos só preciso gerar um relatório ou consulta igual acima, hoje me lista cada registro individualmente:

 


$sql= "select * from avaliacao where ".$tabela." like '%".$texto."%' GROUP BY cpf ".$ordem;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então a questão é que eu já tenho a tabela avaliação nela já constam os campos nome e cpf, massa, idade, só quero agrupar e mostrar todos o resultados referente ao cpf do aluno, pois eu consigo consultar individualmente cada consulta, pois é criado um registro novo para cada uma exemplo:

 

Bom amigão, agora eu não sei se entendi exatamente o que você precisa...

 

Vamos tentar, hehehe

mysql> create table `avaliacao`(
    ->   `id` mediumint(8) unsigned not null auto_increment,
    ->   `cpf` varchar(16) not null,
    ->   `avaliacao` timestamp not null default current_timestamp,
    ->   `massa` smallint(3) unsigned not null,
    ->   `peso` smallint(3) unsigned not null,
    ->   `altura` decimal(5,2) unsigned not null default 0,
    ->   `idade` smallint(3) unsigned not null default 0,
    ->   primary key(`id`),
    ->   key `cpf`(`cpf`),
    ->   key `cpfavaliacao`(`cpf`,`avaliacao`)
    -> ) engine=MyISAM;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into `avaliacao`(`cpf`,`massa`,`peso`,`altura`,`idade`) values
    ->   ('8790.88777.00999',90,89,1.87,20),
    ->   ('8790.88777.00999',80,78,1.87,20),
    ->   ('8790.88777.00999',88,80,1.87,20);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

Ai em cima temos uma aproximação da sua tabela, ai você precisa informar o cpf do aluno e ver todas as avaliações já feitas:

 

mysql> select a.`avaliacao`,a.`massa`,a.`peso`,a.`altura`,a.`idade` from avaliacao a where a.`cpf`='8790.88777.00999';
+---------------------+-------+------+--------+-------+
| avaliacao           | massa | peso | altura | idade |
+---------------------+-------+------+--------+-------+
| 2009-07-23 20:33:55 |    90 |   89 |   1.87 |    20 |
| 2009-07-23 20:33:55 |    80 |   78 |   1.87 |    20 |
| 2009-07-23 20:33:55 |    88 |   80 |   1.87 |    20 |
+---------------------+-------+------+--------+-------+
3 rows in set (0.00 sec)

Eu não vou montar o PHP pq não sei se eu entendi direito dessa vez, hehe

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A lógica é esse, só não consegui implementar no php, veja o meu código

 


$sql= "select a.tavaliacao, a.mmuscular, a.kgossea, a.idade * from avaliacao a where a.cpf='$texto'";

O que faz esse "a"

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

A lógica é esse, só não consegui implementar no php...

 

O que faz esse "a"

 

Esse a é só um apelido para a tabela avaliacao, para não que em consultas com várias tabelas não seja necessário utilizar o nome completo da tabela e para evitar ambiguidade quando se trabalha com mais de uma instância de uma mesma tabela, como nenhum desses é o caso você não precisa dele

 

$avaliacoes = array();
$cpf = '8790.88777.00999';
$sql = sprintf( "select `avaliacao`, `massa`, `peso`, `altura`, `idade` from `avaliacao` where ( `cpf`='%s' );" , $cpf );

if ( ( $res = mysql_query( $sql ) ) ){
    while ( ( $row = mysql_fetch_array( $res , MYSQL_ASSOC ) ) ){
        $avaliacoes[] = sprintf( "<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td>",
            $row[ "avaliacao" ],
            $row[ "massa" ],
            $row[ "peso" ],
            $row[ "altura" ],
            $row[ "idade" ]
        );
    }

    mysql_free_result( $res );

}

$tabela = <<<HTML
<table>
    <thead>
        <tr>
            <th colspan='5'>Avaliações para o CPF: %s</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Data</td>
            <td>Massa</td>
            <td>Peso</td>
            <td>Altura</td>
            <td>Idade</td>
        </tr>
        <tr>%s</tr>
    </tbody>
</table>
HTML;

printf( $tabela , $cpf , implode( "</tr><tr>" , $avaliacoes ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Traduzindo pra php?

 

como faço isso?

 

Hoje tenho da seguinte forma:

 


        <?php
require("../../banco.php");
$ordem=$_POST['ordem'];
$tabela=$_POST['tabela'];
$texto=$_POST['texto'];

if ($texto<>'') {
$sql= "select * from avaliacao where ".$tabela." like '%".$texto."%' GROUP BY cod ".$ordem;
} else {
$sql = "SELECT * FROM avaliacao GROUP BY cod ".$ordem;
}

$cunhu_proprio=mysql_query($sql);



  while ($dados=mysql_fetch_array($cunhu_proprio, MYSQL_ASSOC)){
	
	if ($a==1){
	echo "<tr><td bgcolor=#F3F3F3>".$dados['nome']."</td>";
	
	echo "<td bgcolor=#F3F3F3>".$dados['tavaliacao']."</td>";
	
	echo "<td bgcolor=#F3F3F3>".$dados['data']."</td>";

	echo "<td bgcolor=#F3F3F3>".$dados['cpf']."</td>";
	
	
	
	?>
  <?php 
	  	$a=0;
		}else{
		
				echo "<tr><td bgcolor=#BFDFFF>".$dados['nome']."</td>";
	
	echo "<td bgcolor=#BFDFFF>".$dados['tavaliacao']."</td>";
	
	echo "<td bgcolor=#BFDFFF>".$dados['data']."</td>";

	echo "<td bgcolor=#BFDFFF>".$dados['cpf']."</td>";
	
		
	?>
  <?php 
	  	$a=1;
		}
	}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu o seguinte erro:

 

Parse error: parse error in C:\wamp\www\escola\home\buscar\buscar_avaliacao_completa.php on line 88

 

Tem alguma coisa errada neste trecho:

 


 $tabela = <<<HTML 
<table> 
    <thead> 
        <tr> 
            <th colspan='5'>Avaliações para o CPF: %s</th> 
        </tr> 
    </thead> 
    <tbody> 
        <tr> 
            <td>Data</td> 
            <td>Massa</td> 
            <td>Peso</td> 
            <td>Altura</td> 
            <td>Idade</td> 
        </tr> 
        <tr>%s</tr> 
    </tbody> 
</table> 
HTML; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu o seguinte erro:

 

Parse error: parse error in C:\wamp\www\escola\home\buscar\buscar_avaliacao_completa.php on line 88

 

Você deve estar utilizando uma versão mais antiga do PHP, tenta mudar para:

 

  $tabela = printf( "
 <table> 
     <thead> 
         <tr> 
             <th colspan='5'>Avaliações para o CPF: %s</th> 
         </tr> 
     </thead> 
     <tbody> 
         <tr> 
             <td>Data</td> 
             <td>Massa</td> 
             <td>Peso</td> 
             <td>Altura</td> 
             <td>Idade</td> 
         </tr> 
         <tr>%s</tr> 
     </tbody> 
 </table>" , $cpf , implode( "</tr><tr>" , $avaliacoes ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito, funcionou certinho muito obrigado, em breve vou disponibilizar o sistema todo, para quem quiser fazer alterações ou reutilizar parte dos códigos, como eu fiz.

 

Tópico 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.