Това, което искате да направите, е известно като „завъртане“ на вашите данни и е нещо, за което някои други RDBMS имат собствена поддръжка, но MySQL не (по дизайн, тъй като разработчиците смятат, че подобни манипулации принадлежат на слоя за презентация).
Имате обаче няколко опции:
-
Създайте доста ужасна MySQL заявка, за да извършите ръчно операцията за завъртане:
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
Ако решите да преминете по този път, можете да улесните живота си малко, като генерирате тази заявка автоматично, като използвате или циклична конструкция в PHP, или подготвен израз в MySQL.
Ето един начин, по който можете да направите това в PHP:
-
Получете списък с курсове:
$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);
-
Прегледайте резултатите, като изградите горния 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 = ?";
-
Изпълнете SQL, предавайки масива от курсове като параметри:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Извеждане на резултатите:
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>";
-
-
Направете горното като еднократна операция, така че структурата на вашата MySQL база данни да бъде променена, за да отразява по-точно това желано оформление (лесно след конвертиране на таблицата, но може да повлияе на други приложения на базата данни):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Като алтернатива можете да създадете
VIEW
което е нещо като "виртуална таблица", структурирана по този начин въз основа на основната таблица. -
Завъртете данните ръчно в PHP (относително досадно).