Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment afficher la ligne de la table mysql en tant que colonne

Ce que vous souhaitez faire est connu sous le nom de "pivoter" vos données et c'est quelque chose pour lequel d'autres SGBDR ont un support natif, mais pas MySQL (par conception, car les développeurs estiment que de telles manipulations appartiennent à la couche de présentation).

Cependant, vous avez quelques options :

  1. Construisez une requête MySQL plutôt horrible pour effectuer l'opération de pivotement manuellement :

    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 vous choisissez de suivre cette voie, vous pouvez vous faciliter la vie en générant cette requête automatiquement, en utilisant soit une construction en boucle en PHP, soit une instruction préparée dans MySQL.

    Voici une façon de le faire en PHP :

    1. Obtenir une liste de cours :

      $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. Bouclez sur les résultats, en construisant le SQL ci-dessus :

      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. Exécutez le SQL en passant le tableau des cours en paramètres :

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Afficher les résultats :

      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. Faites ce qui précède comme une opération unique afin que la structure de votre base de données MySQL soit modifiée pour refléter plus fidèlement cette disposition souhaitée (facile une fois la table convertie, mais peut avoir un impact sur d'autres utilisations de la base de données) :

    CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation'))
    SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP
      -- etc. as above
    

    Alternativement, vous pouvez créer une VIEW qui est une sorte de "table virtuelle" ainsi structurée à partir de la table sous-jacente.

  3. Faire pivoter les données manuellement en PHP (relativement fastidieux).