Ir para conteúdo

hufersil

Members
  • Total de itens

    929
  • Registro em

  • Última visita

  • Dias vencidos

    12

Posts postados por hufersil


  1. O que eu faria:

    1. criaria uma tabela-calendário, como esta: http://www.hufersil.com.br/post/recorrencia-de-datas-com-mysql;
    2. colocaria os dados da chamada da semana em uma TEMP;
    3. Montaria a query dinamicamente para trazer os dados que preciso;

    Exemplos:

    CREATE TABLE calendario (
    	`data` DATE NOT NULL,
    	dia_semana INT NOT NULL,
    	semana_ano INT NOT NULL,
    	PRIMARY KEY(`data`)
    ) ENGINE=MyISAM;
    
    
    CREATE TABLE numero (
    	id INT NOT NULL AUTO_INCREMENT, 
    	PRIMARY KEY(id)
    ) ENGINE=MyISAM;
     
    INSERT INTO NUMERO VALUES(NULL);
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    INSERT INTO NUMERO SELECT NULL FROM NUMERO; 
    
    
    
    INSERT INTO calendario 
    SELECT
    	DATE_ADD('2015-01-01', INTERVAL id-1 DAY),
    	DAYOFWEEK(DATE_ADD('2015-01-01', INTERVAL id-1 DAY))-1,
    	WEEKOFYEAR(DATE_ADD('2015-01-01', INTERVAL id-1 DAY))
    FROM numero;
    
    CREATE TABLE `aluno` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nome` varchar(200) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  AUTO_INCREMENT=1;
    
    
    CREATE TABLE `chamada` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_aluno` int(11) NOT NULL,
      `data_chamada` date NOT NULL,
      `presente` tinyint(1) DEFAULT '1',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 ;
    
    
    INSERT INTO `aluno`(`id`, `nome`) VALUES (null, 'Joao');
    INSERT INTO `aluno`(`id`, `nome`) VALUES (null, 'Maria');
    INSERT INTO `aluno`(`id`, `nome`) VALUES (null, 'Pedro');
    

    PHP

    
    # conexao MySQL
    $db = new PDO('mysql:dbname=testes;host=localhost','root','root');
    
    # formato de datas
    $formato = 'Y-m-d';
    
    # inicio e fim da semana
    # pode ser alterado para os periodos desejados
    $inicio = new DateTime('monday this week');
    $fim = new DateTime('friday this week');
    
    # consulta os dias no calendario
    $sql = sprintf("select * from calendario where data between '%s' and '%s'", $inicio->format($formato), $fim->format($formato));
    $stDiasSemana = $db->query($sql) or die('zicou');
    
    # cria uma tabela temporaria com os dados da chamada
    $sql = sprintf("create temporary table tmp_chamada as select * from chamada where data_chamada between '%s' and '%s'", $inicio->format($formato), $fim->format($formato));
    $db->query($sql) or die('zicou');
    
    
    # uma string auxiliar para montar os dias da chamada
    $subDiasChamada = '';
    
    foreach($stDiasSemana->fetchAll(PDO::FETCH_ASSOC) as $row) {
    	$subDiasChamada .= sprintf(
    		"SUM(IF(t.data_chamada = '%s' AND t.presente, 1, 0)) as dia_%s,\n",
    		$row['data'],
    		str_replace('-','_',$row['data'])
    	);
    }
    
    $subDiasChamada = trim(trim($subDiasChamada),',');
    
    # cria consulta
    $sql = "
    	SELECT aluno.id,
    	       nome,
    		   {$subDiasChamada}
    	  FROM aluno
     LEFT JOIN tmp_chamada t ON t.id_aluno = aluno.id
      GROUP BY aluno.id 
    ";
    
    # daqui pra frente é com você
    

    Resultado no PHP My Admin:

     

    Captura_de_Tela_2015_10_01_a_s_16_54_58.

×

Informação importante

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