Mysql
 sql >> Base de données >  >> RDS >> Mysql

colonnes dynamiques à l'aide d'une requête de tableau croisé dynamique

Autant que je sache, vous ne pouvez pas ajouter dynamiquement de colonnes à une instruction SELECT. Ce que vous demandez, c'est une façon de présenter les données et ce n'est pas quelque chose dont MySQL se soucie. Vous devriez gérer cela dans le front-end.

Cependant, vous pouvez tricher en créant vos requêtes dans votre modèle et en ajoutant dynamiquement ces nouvelles colonnes, en insérant dynamiquement plus de MAX(case... à la chaîne de requête. Ce n'est pas une bonne solution, cependant.

Modifier :

Donc, je suppose que vous parlez de la solution laide. Eh bien, en gros, vous devez créer dynamiquement votre chaîne de requête (pseudocode) :

$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...';

Votre requête devrait alors ressembler à ceci pour les dates comprises entre le 18/02/2012 et le 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 étudiant_id

Remarquez que j'ai ajouté des jours au lieu de semaines parce que votre exemple montrait des jours croissants, bien que le nom de la colonne soit des semaines