sql >> Database teknologi >  >> RDS >> Mysql

dynamiske kolonner ved hjælp af pivottabelforespørgsel

Så vidt jeg ved, kan du ikke dynamisk tilføje kolonner til en SELECT-sætning. Det, du beder om, er en måde at præsentere data på, og det er ikke noget, MySQL bekymrer sig om. Du bør klare det i frontenden.

Du kan dog snyde ved at oprette dine forespørgsler i din model og dynamisk tilføje de nye kolonner ved dynamisk at indsætte flere MAX(case... til forespørgselsstrengen. Det er dog ikke en god løsning.

Rediger:

Så du taler vel om den grimme løsning. Nå, dybest set bør du dynamisk oprette din forespørgselsstreng (pseudokode):

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

Så skulle din forespørgsel se sådan ud for datoer fra 18/02/2012 til 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

Bemærk, at jeg tilføjede dage i stedet for uger, fordi dit eksempel viste stigende dage, selvom kolonnenavnet var uger



  1. Mysql hvor 1 =0 forvirring

  2. mysql database insert ændrer alle ID'er til 4294967295

  3. hente den sidst indsatte række fra hver bruger i databasen

  4. Postgresql Vælg rækker, hvor kolonne =matrix