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:
-
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:
-
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);
-
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 = ?";
-
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);
-
Đư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>";
-
-
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. -
Xoay vòng dữ liệu theo cách thủ công trong PHP (tương đối tẻ nhạt).