Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie zeige ich eine MySQL-Tabellenzeile als Spalte an?

Was Sie tun möchten, wird als "Pivotieren" Ihrer Daten bezeichnet und ist etwas, für das einige andere RDBMS native Unterstützung haben, MySQL jedoch nicht (von Natur aus, da die Entwickler der Meinung sind, dass solche Manipulationen in die Präsentationsschicht gehören).

Sie haben jedoch einige Optionen:

  1. Erstellen Sie eine ziemlich schreckliche MySQL-Abfrage, um die Pivot-Operation manuell durchzuführen:

    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
    

    Wenn Sie sich für diesen Weg entscheiden, können Sie sich das Leben etwas leichter machen, indem Sie diese Abfrage automatisch generieren, indem Sie entweder ein Schleifenkonstrukt in PHP oder eine vorbereitete Anweisung in MySQL verwenden.

    Hier ist eine Möglichkeit, dies in PHP zu tun:

    1. Holen Sie sich eine Liste der Kurse:

      $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. Schleife über die Ergebnisse und konstruiere das obige SQL:

      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. Führen Sie die SQL aus und übergeben Sie das Array der Kurse als Parameter:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Ausgabe der Ergebnisse:

      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. Führen Sie das obige als einmaligen Vorgang durch, damit die Struktur Ihrer MySQL-Datenbank geändert wird, um dieses gewünschte Layout besser widerzuspiegeln (einfach, sobald die Tabelle konvertiert ist, kann sich aber auf andere Verwendungen der Datenbank auswirken):

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

    Alternativ können Sie einen VIEW Das ist eine Art "virtueller Tisch", der auf diese Weise basierend auf der zugrunde liegenden Tabelle strukturiert ist.

  3. Pivotieren Sie die Daten manuell in PHP (relativ mühsam).