Lo que desea hacer se conoce como "girar" sus datos y es algo para lo que algunos otros RDBMS tienen soporte nativo, pero MySQL no (por diseño, ya que los desarrolladores sienten que tales manipulaciones pertenecen a la capa de presentación).
Sin embargo, tiene algunas opciones:
-
Construya una consulta MySQL bastante horrible para realizar la operación de pivote 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
Si elige seguir este camino, puede hacer su vida un poco más fácil al generar esta consulta automáticamente, utilizando una construcción de bucle en PHP o una declaración preparada en MySQL.
Aquí hay una forma de hacerlo en PHP:
-
Obtener una 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);
-
Recorra los resultados, construyendo el SQL anterior:
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 = ?";
-
Ejecute el SQL, pasando la matriz de cursos como parámetros:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
Salida de los 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>";
-
-
Haga lo anterior como una operación única para que la estructura de su base de datos MySQL se cambie para reflejar más fielmente este diseño deseado (fácil una vez que se convierte la tabla, pero puede afectar otros usos de la base de datos):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
Alternativamente, puede crear un
VIEW
que es una especie de "tabla virtual" estructurada de esta manera basada en la tabla subyacente. -
Gire los datos manualmente en PHP (relativamente tedioso).