To, co si přejete udělat, je známé jako „pivotování“ vašich dat a je to něco, pro co mají některé jiné RDBMS nativní podporu, ale MySQL ne (záměrně, protože vývojáři se domnívají, že takové manipulace patří do prezentační vrstvy).
Máte však několik možností:
-
Sestavte dosti příšerný dotaz MySQL pro ruční provedení operace pivotování:
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
Pokud se rozhodnete jít touto cestou, můžete si trochu usnadnit život automatickým generováním tohoto dotazu, buď pomocí smyčkové konstrukce v PHP nebo připraveného příkazu v MySQL.
Zde je jeden způsob, jak to můžete udělat v PHP:
-
Získejte seznam kurzů:
$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);
-
Opakujte výsledky a vytvořte výše uvedený 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 = ?";
-
Spusťte SQL a předejte pole kurzů jako parametry:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Výstup výsledků:
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>";
-
-
Výše uvedené proveďte jako jednorázovou operaci, aby se struktura vaší databáze MySQL změnila tak, aby přesněji odrážela toto požadované rozložení (snadné, jakmile je tabulka převedena, ale může mít vliv na další použití databáze):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Případně můžete vytvořit
VIEW
což je jakási „virtuální tabulka“ strukturovaná tímto způsobem na základě podkladové tabulky. -
Natočte data ručně v PHP (poměrně zdlouhavé).