Quello che desideri fare è noto come "girare" i tuoi dati ed è qualcosa per cui alcuni altri RDBMS hanno il supporto nativo, ma MySQL no (in base alla progettazione, poiché gli sviluppatori ritengono che tali manipolazioni appartengano al livello di presentazione).
Tuttavia, hai alcune opzioni:
-
Costruisci una query MySQL piuttosto orribile per eseguire manualmente l'operazione di rotazione:
SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP FROM gp NATURAL JOIN ( SELECT student_id, grade AS MAT111 FROM result WHERE course_code = 'MAT111' ) AS tMAT111 NATURAL JOIN ( SELECT student_id, grade AS MAT112 FROM result WHERE course_code = 'MAT112' ) AS tMAT112 -- etc. WHERE level = @level AND semester = @semester
Se scegli di seguire questo percorso, puoi semplificarti la vita generando automaticamente questa query, utilizzando un costrutto di loop in PHP o un'istruzione preparata in MySQL.
Ecco un modo per farlo in PHP:
-
Ottieni un elenco di corsi:
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password); $qry = $dbh->query("SELECT DISTINCT course_code FROM result [WHERE ...]"); $courses = $qry->fetchAll(PDO::FETCH_COLUMN, 0);
-
Ripeti i risultati, costruendo l'SQL precedente:
mb_regex_encoding($charset); $columns = mb_ereg_replace('`', '``', $courses); $sql = " SELECT student_id AS Matriculation, `".implode("`,`", $columns)."`, gp AS GP FROM gp"; foreach ($columns as $column) $sql .= " NATURAL JOIN ( SELECT student_id, grade AS `$column` FROM result WHERE course_code = ? ) AS `t$column`"; $sql .= " WHERE level = ? AND semester = ?";
-
Eseguire l'SQL, passando come parametri l'array dei corsi:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Genera i risultati:
echo "<table>"; echo "<tr>"; for ($i = 0; $i < $qry->columnCount(); $i++) { $meta = $qry->getcolumnMeta($i); echo "<th scope='col'>" . htmlentities($meta['name']) . "</th>"; } echo "</tr>"; while ($row = $qry->fetch(PDO::FETCH_NUM)) { echo "<tr>"; foreach ($row as $field) echo "<td>" . htmlentities($field) . "</td>" echo "</tr>"; } echo "</table>";
-
-
Fai quanto sopra come un'operazione una tantum in modo che la struttura del tuo database MySQL venga modificata per riflettere più da vicino questo layout desiderato (facile una volta che la tabella è stata convertita, ma può influire su altri usi del database):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
In alternativa, puoi creare un
VIEW
che è una sorta di "tabella virtuale" così strutturata in base alla tabella sottostante. -
Ruota i dati manualmente in PHP (relativamente noioso).