MySQL: Nilai baris dinamik sebagai nama lajur
Soalan:
Bagaimana untuk membina pertanyaan MySQL yang menukar jadual lama dengan nama lajur berubah kepada jadual dengan nama lajur tetap, di mana setiap nilai baris unik untuk lajur tertentu menjadi nama lajur?
Latar belakang:
Pertimbangkan jadual dengan struktur berikut:
<code>id name value ------------------------------ 0 timezone Europe/London 0 language en 0 country 45 0 something x 1 timezone Europe/Paris 1 language fr 1 country 46</code>
Keperluan:
Tukar jadual kepada format berikut:
<code>id timezone language country something --------------------------------------------------- 0 Europe/London en 45 x 1 Europe/Paris fr 46</code>
MySQL tidak menyokong operasi pangsi asli, jadi kami perlu mencari penyelesaian.
Penyelesaian:
GROUP_CONCAT()
boleh digunakan untuk menjana pertanyaan secara dinamik yang mencipta format jadual yang diingini. GROUP_CONCAT()
untuk membina pertanyaan akhir. PREPARE
dan EXECUTE
untuk melaksanakan pertanyaan yang dijana secara dinamik. Pertanyaan:
<code class="language-sql">SELECT CONCAT( 'SELECT `table`.id', GROUP_CONCAT(' , `t_', REPLACE(name, '`', '``'), '`.value AS `', REPLACE(name, '`', '``'), '`' SEPARATOR ''), ' FROM `table` ', GROUP_CONCAT(' LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) SEPARATOR ''), ' GROUP BY `table`.id' ) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; PREPARE stmt FROM @qry; EXECUTE stmt;</code>
Nota:
GROUP_CONCAT()
Panjang hasil dihadkan oleh pembolehubah group_concat_max_len
(lalai ialah 1024 bait). CASE WHEN
atau berbilang subpilihan/gabungan, tetapi ini memerlukan pengendalian manual nilai lajur unik. Atas ialah kandungan terperinci Bagaimana untuk Pivot Jadual MySQL dengan Nama Lajur Dinamik daripada Nilai Baris?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!