sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo muestro la fila de la tabla mysql como columna?

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:

  1. 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:

    1. 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);
      
    2. 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 = ?";
      
    3. 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);
      
    4. 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>";
      
  2. 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.

  3. Gire los datos manualmente en PHP (relativamente tedioso).