Apa yang ingin Anda lakukan dikenal sebagai "memutar" data Anda dan merupakan sesuatu yang beberapa RDBMS lain memiliki dukungan asli, tetapi MySQL tidak (berdasarkan desain, karena pengembang merasa bahwa manipulasi tersebut termasuk dalam lapisan presentasi).
Namun, Anda memiliki beberapa opsi:
-
Buat kueri MySQL yang agak mengerikan untuk melakukan operasi pivot secara manual:
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
Jika Anda memilih untuk menempuh jalan ini, Anda dapat membuat hidup Anda sedikit lebih mudah dengan membuat kueri ini secara otomatis, baik menggunakan konstruksi perulangan di PHP atau pernyataan yang disiapkan di MySQL.
Berikut adalah salah satu cara yang dapat Anda lakukan di PHP:
-
Dapatkan daftar kursus:
$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);
-
Ulangi hasil, buat SQL di atas:
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 = ?";
-
Jalankan SQL, dengan meneruskan array kursus sebagai parameter:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Keluarkan hasilnya:
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>";
-
-
Lakukan hal di atas sebagai operasi satu kali sehingga struktur database MySQL Anda diubah untuk lebih mencerminkan tata letak yang diinginkan ini (mudah setelah tabel dikonversi, tetapi dapat memengaruhi penggunaan database lainnya):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Atau, Anda dapat membuat
VIEW
yang merupakan semacam "tabel virtual" yang terstruktur dengan cara ini berdasarkan tabel yang mendasarinya. -
Pivot data secara manual di PHP (relatif membosankan).