Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để hiển thị hàng bảng mysql dưới dạng cột

Những gì bạn muốn làm được gọi là "xoay vòng" dữ liệu của bạn và là thứ mà một số RDBMS khác có hỗ trợ gốc, nhưng MySQL thì không (theo thiết kế, vì các nhà phát triển cảm thấy rằng các thao tác đó thuộc về lớp trình bày).

Tuy nhiên, bạn có một số tùy chọn:

  1. Tạo một truy vấn MySQL khá khủng khiếp để thực hiện thao tác xoay vòng theo cách thủ công:

    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
    

    Nếu bạn chọn đi theo con đường này, bạn có thể làm cho cuộc sống của mình dễ dàng hơn một chút bằng cách tạo truy vấn này tự động, sử dụng cấu trúc lặp trong PHP hoặc một câu lệnh chuẩn bị sẵn trong MySQL.

    Đây là một cách mà bạn có thể làm điều đó trong PHP:

    1. Nhận danh sách các khóa học:

      $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. Lặp lại các kết quả, xây dựng SQL ở trên:

      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. Thực thi SQL, truyền vào mảng các khóa học dưới dạng tham số:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Đưa ra kết quả:

      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. Thực hiện thao tác trên như một thao tác một lần để cấu trúc cơ sở dữ liệu MySQL của bạn được thay đổi để phản ánh chặt chẽ hơn bố cục mong muốn này (dễ dàng khi bảng được chuyển đổi, nhưng có thể ảnh hưởng đến các mục đích sử dụng khác của cơ sở dữ liệu):

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

    Ngoài ra, bạn có thể tạo VIEW là một loại "bảng ảo" được cấu trúc theo cách này dựa trên bảng bên dưới.

  3. Xoay vòng dữ liệu theo cách thủ công trong PHP (tương đối tẻ nhạt).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_REMOVE () - Xóa dữ liệu khỏi tài liệu JSON trong MySQL

  2. Giá trị trả về thủ tục được lưu trữ trong MySQL

  3. Sử dụng Moodle tạo người dùng và đăng ký họ vào các khóa học qua SQL

  4. SQL CHỌN LIKE (cách viết hoa không nhạy cảm)

  5. MySQL THAM GIA chỉ vào hàng gần đây nhất?