Ir para conteúdo

hufersil

Members
  • Total de itens

    929
  • Registro em

  • Última visita

  • Dias vencidos

    12

Tudo que hufersil postou

  1. hufersil

    Puxar lista de presença na horizontal e vertical

    O que eu faria: criaria uma tabela-calendário, como esta: http://www.hufersil.com.br/post/recorrencia-de-datas-com-mysql; colocaria os dados da chamada da semana em uma TEMP; 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:
×

Informação importante

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