Dalam Mysql, batch menambah berbilang lajur pada jadual berdasarkan lajur lain
P粉336536706
2023-08-28 11:03:44
<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>
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:
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:
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.