Det du vill göra är känt som att "pivotera" din data och är något som vissa andra RDBMS har inbyggt stöd för, men MySQL har inte det (genom designen, eftersom utvecklarna anser att sådana manipulationer hör hemma i presentationslagret).
Du har dock några alternativ:
-
Konstruera en ganska hemsk MySQL-fråga för att utföra svängningsoperationen manuellt:
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
Om du väljer att gå på den här vägen kan du göra ditt liv något enklare genom att generera den här frågan automatiskt, antingen genom att använda en looping-konstruktion i PHP eller en förberedd sats i MySQL.
Här är ett sätt att göra det i PHP:
-
Få en lista över 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);
-
Slinga över resultaten och konstruera ovanstå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 = ?";
-
Kör SQL, skicka in arrayen av kurser som parametrar:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Skriv ut resultaten:
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 ovanstående som en engångsåtgärd så att strukturen på din MySQL-databas ändras för att bättre återspegla den önskade layouten (lätt när tabellen väl har konverterats, men kan påverka andra användningar av databasen):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Alternativt kan du skapa en
VIEW
som är en sorts "virtuell tabell" strukturerad på detta sätt baserat på den underliggande tabellen. -
Pivotera data manuellt i PHP (relativt tråkigt).