Pertanyaan Jadual Pangsi MySQL Lajur Dinamik
P粉262113569
P粉262113569 2023-08-27 17:24:10
0
2
469
<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粉262113569
P粉262113569

membalas semua(2)
P粉604848588

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

P粉495955986

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan