Até onde eu sei, você não pode adicionar colunas dinamicamente a uma instrução SELECT. O que você está pedindo é uma forma de apresentar os dados e isso não é algo com que o MySQL se importe. Você deve lidar com isso no front-end.
No entanto, você pode trapacear criando suas consultas em seu modelo e adicionando dinamicamente essas novas colunas, inserindo dinamicamente mais
MAX(case...
para a string de consulta. Essa não é uma boa solução, no entanto. Editar:
Então, eu acho que você está falando sobre a solução feia. Bem, basicamente você deve criar dinamicamente sua string de consulta (pseudocódigo):
$initialDay = 02/28/2012;
$lastDay = 03/28/2012;
$dayNumber = 1;
$sql = 'Select cadet_record.fname,cadet_record.lname,cadet_record.mname, student_id';
while ($initialDay <= $lastDay) {
$sql .= ', MAX(case WHEN week = $initialDay then present end) as day' . $dayNumber;
$initialDay = $initialDay + 1 day;
$dayNumber++;
}
$sql .= ' From attendance blah blah...';
Então sua consulta deve ficar assim para as datas de 18/02/2012 a 18/03/2012:
Select cadet_record.fname,cadet_record.lname,cadet_record.mname, student_id,
,MAX(case WHEN week = '02/18/2012' then present end) as day1
,MAX(case WHEN week = '02/19/2012' then present end) as day2
From attendance
LEFT JOIN cadet_record ON cadet_record.stud_no = attendance.student_id WHERE section = '$section' AND schoolyear = '$year' AND component = '$component' AND semester = '$semester'
GROUP BY student_id
Observe que adicionei dias em vez de semanas porque seu exemplo mostrou dias crescentes, embora o nome da coluna fosse semanas