To, co chcesz zrobić, jest znane jako „przechylanie” swoich danych i jest to coś, co niektóre inne RDBMS mają natywną obsługę, ale MySQL nie (z założenia, ponieważ programiści uważają, że takie manipulacje należą do warstwy prezentacji).
Masz jednak kilka opcji:
-
Skonstruuj dość okropne zapytanie MySQL, aby ręcznie wykonać operację obracania:
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
Jeśli zdecydujesz się pójść tą ścieżką, możesz nieco ułatwić sobie życie, generując to zapytanie automatycznie, używając konstrukcji pętli w PHP lub przygotowanej instrukcji w MySQL.
Oto jeden ze sposobów, w jaki możesz to zrobić w PHP:
-
Uzyskaj listę kursów:
$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);
-
Zapętl wyniki, konstruując powyższy kod 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 = ?";
-
Wykonaj SQL, przekazując tablicę kursów jako parametry:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Wyślij wyniki:
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>";
-
-
Wykonaj powyższe jako jednorazową operację, aby struktura bazy danych MySQL została zmieniona w celu lepszego odzwierciedlenia pożądanego układu (łatwe po przekonwertowaniu tabeli, ale może to wpłynąć na inne zastosowania bazy danych):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Alternatywnie możesz utworzyć
VIEW
która jest rodzajem „wirtualnej tabeli” skonstruowanej w ten sposób na podstawie tabeli bazowej. -
Obróć dane ręcznie w PHP (stosunkowo żmudne).