Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menampilkan baris tabel mysql sebagai kolom?

Apa yang ingin Anda lakukan dikenal sebagai "memutar" data Anda dan merupakan sesuatu yang beberapa RDBMS lain memiliki dukungan asli, tetapi MySQL tidak (berdasarkan desain, karena pengembang merasa bahwa manipulasi tersebut termasuk dalam lapisan presentasi).

Namun, Anda memiliki beberapa opsi:

  1. Buat kueri MySQL yang agak mengerikan untuk melakukan operasi pivot secara manual:

    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
    

    Jika Anda memilih untuk menempuh jalan ini, Anda dapat membuat hidup Anda sedikit lebih mudah dengan membuat kueri ini secara otomatis, baik menggunakan konstruksi perulangan di PHP atau pernyataan yang disiapkan di MySQL.

    Berikut adalah salah satu cara yang dapat Anda lakukan di PHP:

    1. Dapatkan daftar kursus:

      $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. Ulangi hasil, buat SQL di atas:

      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. Jalankan SQL, dengan meneruskan array kursus sebagai parameter:

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

      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. Lakukan hal di atas sebagai operasi satu kali sehingga struktur database MySQL Anda diubah untuk lebih mencerminkan tata letak yang diinginkan ini (mudah setelah tabel dikonversi, tetapi dapat memengaruhi penggunaan database lainnya):

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

    Atau, Anda dapat membuat VIEW yang merupakan semacam "tabel virtual" yang terstruktur dengan cara ini berdasarkan tabel yang mendasarinya.

  3. Pivot data secara manual di PHP (relatif membosankan).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengakses database server secara langsung melalui Ajax (tanpa PHP atau perantara lainnya)

  2. Permintaan Pembaruan SQL dengan grup demi klausa

  3. Cara memesan berdasarkan data tabel pivot di Eloquent ORM Laravel

  4. Cara menghapus database mysql melalui perintah shell

  5. Kunci Asing - Apa yang mereka lakukan untuk saya?