Bagaimana untuk Membuat Penjadualan Silang secara Dinamik dalam MySQL dengan Nama Lajur yang Berbeza-beza?

Barbara Streisand
Lepaskan: 2024-10-28 08:09:01
asal
160 orang telah melayarinya

How to Dynamically Create Cross-Tabulations in MySQL with Varying Column Names?

MySQL Dynamic Cross Tabulation

Masalah:

Pertimbangkan jadual yang mengandungi atribut seperti " cara," "berhenti," dan "masa." Objektifnya adalah untuk mengubah data ini menjadi format jadual silang, dengan lajur mewakili nilai "jalan" yang berbeza dan baris mewakili nilai "berhenti". Setiap sel mengandungi "masa" maksimum yang direkodkan untuk gabungan "cara" dan "berhenti" yang sepadan.

Penyelesaian Dinamik:

Penghadan MySQL menentukan nama lajur dan nombor mesti diperbaiki semasa pelaksanaan pertanyaan. Untuk mengatasi cabaran ini, pertimbangkan dua pendekatan berasaskan aplikasi:

Pilihan 1: Nilai Berbeza Pertanyaan

  • Dapatkan nilai "cara" yang berbeza menggunakan pertanyaan SELECT DISTINCT .
  • Bina pertanyaan pangsi secara dinamik dengan menambahkan klausa MAX(IF()) yang diperlukan pada senarai SELECT.
  • Laksanakan pertanyaan pangsi yang dijana untuk mendapatkan hasil jadual silang yang diingini.

Pilihan 2: Pemprosesan Baris demi Baris

  • Soal data baris demi baris menggunakan pertanyaan SELECT * yang mudah.
  • Buat tatasusunan bersekutu yang menyimpan "berhenti" sebagai kunci dan tatasusunan nilai "jalan" dan nilai "masa" yang sepadan sebagai nilai.
  • Proses setiap baris, mengisi nilai way_n dalam "berhenti" yang berkaitan " tatasusunan kunci.

Pelaksanaan:

Untuk Pilihan 1:

$way_array = [];
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`";
$pivotstmt = $pdo->query($pivotsql);
Salin selepas log masuk

Untuk Pilihan 2:

$stoparray = [];
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
  $stopkey = $row["stop"];
  if (!array_key_exists($stopkey, $stoparray)) {
    $stoparray[$stopkey] = ["stop"=>$stopkey];
  }
  $waykey = "way_" . $row["way"];
  $stoparray[$stopkey][$waykey] = $row["time"];
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Membuat Penjadualan Silang secara Dinamik dalam MySQL dengan Nama Lajur yang Berbeza-beza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!