Keperluan anda adalah untuk memutar data daripada produk dan produk_jadual tambahan, dengan lajur diisi secara dinamik berdasarkan nilai dalam produk_jadual tambahan. Pertanyaan semasa, yang menggunakan pengagregatan bersyarat dengan IF(), tidak dinamik dan memerlukan perubahan manual dengan setiap medan baharu ditambah.
Untuk mencapai pangsi dinamik dalam MySQL, kami boleh menggunakan pernyataan yang disediakan, yang membolehkan kami membina rentetan pertanyaan pada masa jalan. Kod berikut menunjukkan pendekatan ini:
-- Initialize @sql variable SET @sql = NULL; -- Dynamically create the query string by iterating over distinct `fieldname` values SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) ) INTO @sql FROM product_additional; -- Concatenate the constructed string with the base query SET @sql = CONCAT('SELECT p.id , p.name , p.description, ', @sql, ' FROM product p LEFT JOIN product_additional AS pa ON p.id = pa.id GROUP BY p.id, p.name, p.description'); -- Prepare the query PREPARE stmt FROM @sql; -- Execute the prepared query EXECUTE stmt; -- Deallocate the prepared statement DEALLOCATE PREPARE stmt;
Kod ini menjana rentetan pertanyaan dinamik berdasarkan nilai nama medan unik dalam jadual product_additional. Rentetan itu kemudiannya digunakan untuk membina pernyataan PREPARE, yang dilaksanakan dan kemudian dialokasikan.
Perhatikan bahawa fungsi GROUP_CONCAT mempunyai had aksara sebanyak 1024 aksara. Anda boleh meningkatkan had ini dengan menetapkan parameter group_concat_max_len.
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Pertanyaan Jadual Pangsi MySQL Dinamik Menggunakan Penyata Disediakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!