Det, du ønsker at gøre, er kendt som at "pivotere" dine data og er noget, som nogle andre RDBMS har indbygget understøttelse for, men det gør MySQL ikke (ved design, da udviklerne føler, at sådanne manipulationer hører hjemme i præsentationslaget).
Du har dog et par muligheder:
-
Konstruer en ret forfærdelig MySQL-forespørgsel for at udføre pivoteringsoperationen manuelt:
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
Hvis du vælger at gå ned ad denne vej, kan du gøre dit liv lidt lettere ved at generere denne forespørgsel automatisk ved at bruge enten en looping-konstruktion i PHP eller en forberedt sætning i MySQL.
Her er en måde, du kan gøre det på i PHP:
-
Få en liste over kurser:
$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 resultaterne og konstruer ovenstående 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 = ?";
-
Udfør SQL'en, og indfør rækken af kurser som parametre:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Udskriv resultaterne:
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>";
-
-
Gør ovenstående som en engangshandling, så strukturen af din MySQL-database ændres, så den i højere grad afspejler dette ønskede layout (let, når først tabellen er konverteret, men kan påvirke andre anvendelser af databasen):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Alternativt kan du oprette en
VIEW
som er en slags "virtuel tabel" struktureret på denne måde baseret på den underliggende tabel. -
Drej dataene manuelt i PHP (relativt kedeligt).