Mysql
 sql >> Database >  >> RDS >> Mysql

Come faccio a visualizzare la riga della tabella MySQL come colonna

Quello che desideri fare è noto come "girare" i tuoi dati ed è qualcosa per cui alcuni altri RDBMS hanno il supporto nativo, ma MySQL no (in base alla progettazione, poiché gli sviluppatori ritengono che tali manipolazioni appartengano al livello di presentazione).

Tuttavia, hai alcune opzioni:

  1. Costruisci una query MySQL piuttosto orribile per eseguire manualmente l'operazione di rotazione:

    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 scegli di seguire questo percorso, puoi semplificarti la vita generando automaticamente questa query, utilizzando un costrutto di loop in PHP o un'istruzione preparata in MySQL.

    Ecco un modo per farlo in PHP:

    1. Ottieni un elenco di corsi:

      $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. Ripeti i risultati, costruendo l'SQL precedente:

      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. Eseguire l'SQL, passando come parametri l'array dei corsi:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Genera i risultati:

      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. Fai quanto sopra come un'operazione una tantum in modo che la struttura del tuo database MySQL venga modificata per riflettere più da vicino questo layout desiderato (facile una volta che la tabella è stata convertita, ma può influire su altri usi del database):

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

    In alternativa, puoi creare un VIEW che è una sorta di "tabella virtuale" così strutturata in base alla tabella sottostante.

  3. Ruota i dati manualmente in PHP (relativamente noioso).