Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да покажа реда на таблицата на mysql като колона

Това, което искате да направите, е известно като „завъртане“ на вашите данни и е нещо, за което някои други RDBMS имат собствена поддръжка, но MySQL не (по дизайн, тъй като разработчиците смятат, че подобни манипулации принадлежат на слоя за презентация).

Имате обаче няколко опции:

  1. Създайте доста ужасна MySQL заявка, за да извършите ръчно операцията за завъртане:

    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
    

    Ако решите да преминете по този път, можете да улесните живота си малко, като генерирате тази заявка автоматично, като използвате или циклична конструкция в PHP, или подготвен израз в MySQL.

    Ето един начин, по който можете да направите това в PHP:

    1. Получете списък с курсове:

      $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. Прегледайте резултатите, като изградите горния 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. Изпълнете SQL, предавайки масива от курсове като параметри:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Извеждане на резултатите:

      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. Направете горното като еднократна операция, така че структурата на вашата MySQL база данни да бъде променена, за да отразява по-точно това желано оформление (лесно след конвертиране на таблицата, но може да повлияе на други приложения на базата данни):

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

    Като алтернатива можете да създадете VIEW което е нещо като "виртуална таблица", структурирана по този начин въз основа на основната таблица.

  3. Завъртете данните ръчно в PHP (относително досадно).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се отървете от СТРОГИЯ SQL режим в MySQL

  2. Как да използвам регулярен израз в MySQL?

  3. мога ли да нулирам полето auto_increment в mySql?

  4. Получаване на данни от mysql до StreamBuilder Flutter

  5. Как първо да използвате кода на MySql и Entity Framework 4.1