O que você deseja fazer é conhecido como "pivotar" seus dados e é algo para o qual alguns outros RDBMS têm suporte nativo, mas o MySQL não (por design, pois os desenvolvedores sentem que tais manipulações pertencem à camada de apresentação).
No entanto, você tem algumas opções:
-
Construa uma consulta MySQL bastante horrível para executar a operação de pivotamento manualmente:
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
Se você optar por seguir esse caminho, poderá tornar sua vida um pouco mais fácil gerando essa consulta automaticamente, usando uma construção de loop em PHP ou uma instrução preparada em MySQL.
Aqui está uma maneira de fazer isso em PHP:
-
Obtenha uma lista de cursos:
$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);
-
Faça um loop sobre os resultados, construindo o SQL acima:
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 = ?";
-
Execute o SQL, passando o array de cursos como parâmetros:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Emita os resultados:
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>";
-
-
Faça o acima como uma operação única para que a estrutura do seu banco de dados MySQL seja alterada para refletir mais de perto esse layout desejado (fácil depois que a tabela for convertida, mas pode afetar outros usos do banco de dados):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Como alternativa, você pode criar umaVIEW
que é uma espécie de "tabela virtual" estruturada dessa maneira com base na tabela subjacente.
-
Pivote os dados manualmente em PHP (relativamente tedioso).