Rumah  >  Soal Jawab  >  teks badan

Dalam Mysql, batch menambah berbilang lajur pada jadual berdasarkan lajur lain

<p>Saya mempunyai jadual dengan tiga lajur. Untuk setiap id, kami mempunyai sehingga 400 nilai <code>index</code> Saya ingin menambah lajur berdasarkan bilangan indeks. Dalam contoh yang saya berikan, saya mempunyai 4 indeks dan kemudian saya menambah empat lajur pada jadual. Inilah jadual yang saya ada: </p> <pre class="brush:php;toolbar:false;">Buat jadual beli_jual (id int, idx varchar(255), jual float(2, 1)); masukkan ke dalam nilai jual_beli (id, idx, sell) ('1', 'a', '4'); masukkan ke dalam nilai beli_jual (id, idx, jual) ('1', 'b', '6'); masukkan ke dalam nilai jual_beli (id, idx, sell) ('1', 'c', '8'); masukkan ke dalam nilai beli_jual (id, idx, jual) ('1', 'd', '9'); masukkan ke dalam nilai beli_jual (id, idx, jual) ('3', 'b', '1'); masukkan ke dalam nilai beli_jual (id, idx, jual) ('3', 'c', '2'); masukkan ke dalam nilai beli_jual (id, idx, jual) ('2', 'a', '5'); masukkan ke dalam nilai jual_beli (id, idx, sell) ('2', 'b', '7'); masukkan ke dalam nilai beli_jual (id, idx, jual) ('2', 'd', '5'); PILIH * DARI buy_sell;</pre> <p>Inilah hasilnya:</p> <table class="s-table"> <kepala> <tr> <th>id</th> <th>idx</th> <th>Untuk Dijual</th> </tr> </kepala> <tbody> <tr> <td>1</td> <td>a</td> <td>4.0</td> </tr> <tr> <td>1</td> <td>b</td> <td>6.0</td> </tr> <tr> <td>1</td> <td>c</td> <td>8.0</td> </tr> <tr> <td>1</td> <td>d</td> <td>9.0</td> </tr> <tr> <td>3</td> <td>b</td> <td>1.0</td> </tr> <tr> <td>3</td> <td>c</td> <td>2.0</td> </tr> <tr> <td>2</td> <td>a</td> <td>5.0</td> </tr> <tr> <td>2</td> <td>b</td> <td>7.0</td> </tr> <tr> <td>2</td> <td>d</td> <td>5.0</td> </tr> </tbody> </table> <p>Sebagai contoh, untuk id=1, kami mempunyai empat indeks di sini (a, b, c, d), dan kemudian kami mempunyai empat lajur bukan sifar.Untuk id = 3 kita mempunyai dua indeks (b, c) dan kemudian kita mempunyai dua lajur bukan sifar, jadi untuk lajur pertama kita letak sifar, untuk lajur kedua kita letak 1 dan untuk lajur ketiga kita Letakkan 2. Begitu seterusnya dan seterusnya. Inilah jadual yang saya mahu: </p> <table class="s-table"> <kepala> <tr> <th>id</th> <th>Jual 1</th> <th>Jual 2</th> <th>Jual 3</th> <th>Jual 4</th> </tr> </kepala> <tbody> <tr> <td>1</td> <td>4</td> <td>6</td> <td>8</td> <td>9</td> </tr> <tr> <td>3</td> <td>0</td> <td>1</td> <td>2</td> <td>0</td> </tr> <tr> <td>2</td> <td>5</td> <td>7</td> <td>0</td> <td>5</td> </tr> </tbody> </table> <p>Saya banyak mencari dan mencuba <code>Group_concat</code>, <code>JSON_ARRAYAGG</code> tetapi saya tidak dapat mencari penyelesaian. apa yang perlu saya buat? </p>
P粉336536706P粉336536706396 hari yang lalu453

membalas semua(1)saya akan balas

  • P粉302484366

    P粉3024843662023-08-29 09:19:47

    Bahasa SQL mempunyai keperluan yang sangat ketat untuk mengetahui bilangan lajur dalam hasil pada masa penyusunan pertanyaan, sebelum melihat sebarang data. Jika anda perlu melihat data untuk menentukan bilangan lajur yang anda inginkan, maka anda hanya boleh menggunakan SQL dinamik (berpotensi berbahaya), yang memerlukan tiga langkah:

    1. Jalankan pertanyaan untuk mencari maklumat tentang lajur yang diperlukan.
    2. Bina pernyataan SQL baharu secara dinamik menggunakan keputusan langkah 1.
    3. Jalankan SQL dari langkah 2.

    Dalam kes ini, anda tidak tahu berapa banyak lajur yang diperlukan, cuma ia adalah "sehingga 400 lajur". Dengan mengambil kira perkara ini, anda mungkin melihat kod seperti ini:

    SELECT ID, 
         MAX(CASE WHEN IDX = 'a' THEN sell ELSE 0 END) as sell1, 
         MAX(CASE WHEN IDX = 'b' THEN sell ELSE 0 END) as sell2, 
         MAX(CASE WHEN IDX = 'c' THEN sell ELSE 0 END) as sell3,
         -- ... 
         MAX(CASE WHEN IDX = '??' THEN sell ELSE 0 END) as sell400
    FROM `buy_sell`
    GROUP BY ID

    Ya, anda perlu menentukan sesuatu dalam pertanyaan untuk setiap lajur yang mungkin. Ini juga menganggap sell值都大于0。如果你的值可能是正数和负数的混合,你可以尝试使用SUM()而不是MAX() anda.

    Pendekatan ini juga secara langsung bertentangan dengan prinsip teori yang ditetapkan di sebalik pangkalan data hubungan, jadi secara praktikal anda lebih baik membiarkan kod pelanggan atau alat pelaporan melakukan pemutaran pada data.

    balas
    0
  • Batalbalas