Wat u wilt doen, staat bekend als het "draaien" van uw gegevens en is iets waarvoor sommige andere RDBMS native ondersteuning hebben, maar MySQL niet (door ontwerp, aangezien de ontwikkelaars vinden dat dergelijke manipulaties in de presentatielaag thuishoren).
Je hebt echter een paar opties:
-
Maak een nogal vreselijke MySQL-query om de draaibewerking handmatig uit te voeren:
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
Als u ervoor kiest om dit pad te volgen, kunt u uw leven iets gemakkelijker maken door deze query automatisch te genereren, met behulp van een looping-constructie in PHP of een voorbereide instructie in MySQL.
Hier is een manier om dat in PHP te doen:
-
Een lijst met cursussen verkrijgen:
$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);
-
Loop over de resultaten en maak de bovenstaande SQL:
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 = ?";
-
Voer de SQL uit en geef de reeks cursussen door als parameters:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Voer de resultaten uit:
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>";
-
-
Doe het bovenstaande als een eenmalige handeling zodat de structuur van uw MySQL-database wordt gewijzigd om deze gewenste lay-out beter weer te geven (eenvoudig als de tabel eenmaal is geconverteerd, maar kan van invloed zijn op ander gebruik van de database):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
U kunt ook een
VIEW
wat een soort "virtuele tabel" is die op deze manier is gestructureerd op basis van de onderliggende tabel. -
Draai de gegevens handmatig in PHP (relatief vervelend).