Số lượng và tên của các cột phải được cố định tại thời điểm bạn chuẩn bị truy vấn. Đó chỉ là cách SQL hoạt động.
Vì vậy, bạn có hai lựa chọn về cách giải quyết vấn đề này. Cả hai lựa chọn đều liên quan đến việc viết mã ứng dụng:
(1) Truy vấn các giá trị riêng biệt của way
và sau đó viết mã để sử dụng chúng để tạo truy vấn tổng hợp, nối càng nhiều cột trong danh sách CHỌN bằng số giá trị riêng biệt.
foreach ($pdo->query("SELECT DISTINCT `way` FROM `MyTable`") as $row) {
$way = (int) $row["way"];
$way_array[] = "MAX(IF(`way`=$way, `time`)) AS way_$way";
}
$pivotsql = "SELECT stop, " . join(", ", $way_array) .
"FROM `MyTable` GROUP BY `stop`";
Bây giờ bạn có thể chạy truy vấn mới và nó có bao nhiêu cột bằng số way
riêng biệt giá trị.
$pivotstmt = $pdo->query($pivotsql);
(2) Truy vấn từng hàng dữ liệu vì nó được cấu trúc trong cơ sở dữ liệu của bạn và sau đó viết mã để xoay thành các cột trước khi bạn hiển thị dữ liệu.
$stoparray = array();
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
$stopkey = $row["stop"];
if (!array_key_exists($stopkey, $stoparray)) {
$stoparray[$stopkey] = array("stop"=>$stopkey);
}
$waykey = "way_" . $row["way"];
$stoparray[$stopkey][$waykey] = $row["time"];
}
Bây giờ bạn có một mảng các mảng trông giống như thể bạn đã chạy một truy vấn tổng hợp, nhưng SQL thực tế mà bạn chạy đơn giản hơn rất nhiều. Bạn đã xử lý hậu kỳ kết quả truy vấn thành một tập hợp mảng khác.