Mysql
 sql >> Datenbank >  >> RDS >> Mysql

dynamische Spalten mit Pivot-Tabellenabfrage

Soweit ich weiß, können Sie einer SELECT-Anweisung keine Spalten dynamisch hinzufügen. Was Sie verlangen, ist eine Möglichkeit, Daten zu präsentieren, und darum kümmert sich MySQL nicht. Das sollten Sie im Frontend erledigen.

Sie können jedoch schummeln, indem Sie Ihre Abfragen in Ihrem Modell erstellen und diese neuen Spalten dynamisch hinzufügen, indem Sie dynamisch mehr MAX(case... einfügen zur Abfragezeichenfolge. Das ist aber keine schöne Lösung.

Bearbeiten:

Also schätze ich, du redest von der hässlichen Lösung. Nun, im Grunde sollten Sie Ihren Abfragestring (Pseudocode) dynamisch erstellen:

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

Dann sollte Ihre Abfrage für Daten vom 18.02.2012 bis 18.03.2012 so aussehen:

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'

GRUPPE NACH student_id

Beachten Sie, dass ich Tage anstelle von Wochen hinzugefügt habe, weil Ihr Beispiel zunehmende Tage zeigte, obwohl der Spaltenname Wochen war