Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para exibir a linha da tabela mysql como coluna


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:

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

    1. 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);
      

    2. 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 = ?";
      

    3. 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);
      

    4. 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>";
      

  2. 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 uma VIEW que é uma espécie de "tabela virtual" estruturada dessa maneira com base na tabela subjacente.

  3. Pivote os dados manualmente em PHP (relativamente tedioso).