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: