Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wyświetlić wiersz tabeli mysql jako kolumnę?

To, co chcesz zrobić, jest znane jako „przechylanie” swoich danych i jest to coś, co niektóre inne RDBMS mają natywną obsługę, ale MySQL nie (z założenia, ponieważ programiści uważają, że takie manipulacje należą do warstwy prezentacji).

Masz jednak kilka opcji:

  1. Skonstruuj dość okropne zapytanie MySQL, aby ręcznie wykonać operację obracania:

    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
    

    Jeśli zdecydujesz się pójść tą ścieżką, możesz nieco ułatwić sobie życie, generując to zapytanie automatycznie, używając konstrukcji pętli w PHP lub przygotowanej instrukcji w MySQL.

    Oto jeden ze sposobów, w jaki możesz to zrobić w PHP:

    1. Uzyskaj listę kursów:

      $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. Zapętl wyniki, konstruując powyższy kod 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. Wykonaj SQL, przekazując tablicę kursów jako parametry:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Wyślij wyniki:

      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. Wykonaj powyższe jako jednorazową operację, aby struktura bazy danych MySQL została zmieniona w celu lepszego odzwierciedlenia pożądanego układu (łatwe po przekonwertowaniu tabeli, ale może to wpłynąć na inne zastosowania bazy danych):

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

    Alternatywnie możesz utworzyć VIEW która jest rodzajem „wirtualnej tabeli” skonstruowanej w ten sposób na podstawie tabeli bazowej.

  3. Obróć dane ręcznie w PHP (stosunkowo żmudne).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zmień domyślny silnik mysql na innodb

  2. Neo4j - Usuń ograniczenie za pomocą Cypher

  3. Zainstaluj i używaj Percona Toolkit na Centos 7

  4. Monitorowanie postępu długich zapytań MySQL

  5. Funkcja MySQL COT() — zwraca cotangens liczby w MySQL