Rumah  >  Soal Jawab  >  teks badan

Pertanyaan Jadual Pangsi MySQL Lajur Dinamik

<p>Saya menggunakan jadual berikut untuk menyimpan data produk: </p> <pre class="brush:php;toolbar:false;">mysql> +--------------+----------------+--------+ |. id | +--------------+----------------+--------+ |. 1 |. produk pertama | |. 2 |. produk kedua | +--------------+----------------+--------+ mysql> PILIH * DARI product_additional; +-----------------+----------------+ |. id | +-----------------+----------------+ |. 1 | |. 1 | |. 2 | |. 2 | |. 2 | +----------------+----------------+</pre> <p>Gunakan pertanyaan berikut untuk memilih rekod daripada dua jadual</p> <pre class="brush:php;toolbar:false;">mysql> p.id ,p.nama , p.penerangan ,MAX(IF(pa.fieldname = 'saiz', pa.fieldvalue, NULL)) sebagai `saiz` ,MAX(IF(pa.fieldname = 'height', pa.fieldvalue, NULL)) sebagai `height` ,MAX(IF(pa.fieldname = 'color', pa.fieldvalue, NULL)) sebagai `color` DARI produk p KIRI SERTAI produk_tambahan AS pa PADA p.id = pa.id KUMPULAN OLEH p.id +--------------+----------------+--------+-------- -+--------+ |. id | +--------------+----------------+--------+-------- -+--------+ |. 1 |. produk pertama | |. produk2 | +--------------+----------------+--------+-------- -+--------+</pra> <p>Semuanya baik :) </p> <p>Memandangkan saya mengisi jadual "tambah" secara dinamik, adalah bagus jika pertanyaan itu juga dinamik. Dengan cara ini saya tidak perlu menukar pertanyaan setiap kali saya memasukkan nama medan dan nilai medan baharu. </p>
P粉262113569P粉262113569419 hari yang lalu413

membalas semua(2)saya akan balas

  • P粉604848588

    P粉6048485882023-08-28 16:02:00

    Pendekatan saya sedikit berbeza daripada jawapan yang diterima. Dengan cara ini anda mengelak daripada menggunakan GROUP_CONCAT, yang mempunyai had lalai 1024 aksara, yang tidak akan berfungsi jika anda mempunyai banyak medan melainkan anda menukar had tersebut.

    SET @sql = '';
    SELECT
        @sql := CONCAT(@sql,if(@sql='','',', '),temp.output)
    FROM
    (
        SELECT
          DISTINCT
            CONCAT(
             'MAX(IF(pa.fieldname = ''',
              fieldname,
              ''', pa.fieldvalue, NULL)) AS ',
              fieldname
            ) as output
        FROM
            product_additional
    ) as temp;
    
    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 stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    Klik di sini untuk melihat demo

    balas
    0
  • P粉495955986

    P粉4959559862023-08-28 10:33:43

    Satu-satunya cara untuk melakukan ini secara dinamik dalam MySQL ialah menggunakan pernyataan yang disediakan. Berikut ialah artikel hebat tentang mereka:

    Jadual Pangsi Dinamik (tukar baris kepada lajur)

    Kod anda akan kelihatan seperti ini:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(IF(pa.fieldname = ''',
          fieldname,
          ''', pa.fieldvalue, NULL)) AS ',
          fieldname
        )
      ) INTO @sql
    FROM product_additional;
    
    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 stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    Lihat Demo

    Nota: Fungsi GROUP_CONCAT mempunyai had panjang 1024 aksara. Lihat kumpulan parameter_concat_max_len

    balas
    0
  • Batalbalas