Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Membuat Penjadualan Silang secara Dinamik dalam MySQL dengan Nama Lajur yang Berbeza-beza?

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

Barbara Streisand
Barbara Streisandasal
2024-10-28 08:09:01161semak imbas

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);

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"];
}

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!

Kenyataan:
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