Fügen Sie in MySQL mehrere Spalten basierend auf einer anderen Spalte stapelweise zur Tabelle hinzu
P粉336536706
2023-08-28 11:03:44
<p>Ich habe eine Tabelle mit drei Spalten.
Für jede ID haben wir bis zu 400 <code>index</code>-Werte. Ich möchte Spalten basierend auf der Anzahl der Indizes hinzufügen. In dem von mir bereitgestellten Beispiel habe ich vier Indizes und habe dann vier Spalten zur Tabelle hinzugefügt. Dies ist die Tabelle, die ich habe: </p>
<pre class="brush:php;toolbar:false;">Tabelle buy_sell erstellen (id int, idx varchar(255), sale float(2, 1));
in buy_sell (id, idx, sale) Werte einfügen ('1', 'a', '4');
in buy_sell (id, idx, sale) Werte einfügen ('1', 'b', '6');
in buy_sell (id, idx, sale) Werte einfügen ('1', 'c', '8');
in buy_sell (id, idx, sale) Werte einfügen ('1', 'd', '9');
in buy_sell (id, idx, sale) Werte einfügen ('3', 'b', '1');
in buy_sell (id, idx, sale) Werte einfügen ('3', 'c', '2');
in buy_sell (id, idx, sale) Werte einfügen ('2', 'a', '5');
in buy_sell (id, idx, sale) Werte einfügen ('2', 'b', '7');
in buy_sell (id, idx, sale) Werte einfügen ('2', 'd', '5');
SELECT * FROM buy_sell;</pre>
<p>Das ist das Ergebnis: </p>
<table class="s-table">
<thead>
<tr>
<th>id</th>
<th>idx</th>
<th>Zu verkaufen</th>
</tr>
</thead>
<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>Für id=1 haben wir hier beispielsweise vier Indizes (a, b, c, d) und dann vier Spalten ungleich Null.Für id = 3 haben wir zwei Indizes (b, c) und dann zwei Spalten ungleich Null, also geben wir für die erste Spalte eine Null, für die zweite Spalte eine 1 und für die dritte Spalte eine 2 ein. Und so weiter und so fort. Dies ist die Tabelle, die ich möchte: </p>
<table class="s-table">
<thead>
<tr>
<th>id</th>
<th>1 verkaufen</th>
<th>2 verkaufen</th>
<th>3 verkaufen</th>
<th>4 verkaufen</th>
</tr>
</thead>
<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>Ich habe viel gesucht und <code>Group_concat</code>, <code>JSON_ARRAYAGG</code> usw. ausprobiert, konnte aber keine Lösung finden. was muss ich tun? </p>
SQL语言对于在查询编译时知道结果中的列数有非常严格的要求,在查看任何数据之前。如果你必须查看数据来确定你想要的列数,那么你只能使用(潜在危险的)动态SQL,需要三个步骤:
在这种情况下,你不知道需要多少列,只知道它是“最多400列”。考虑到这一点,你可能会看到像这样的代码:
是的,你确实需要在查询中为每个可能的列指定一些内容。这也假设你的
sell
值都大于0。如果你的值可能是正数和负数的混合,你可以尝试使用SUM()
而不是MAX()
。这种做法也与关系数据库背后的集合论原则直接相悖,因此在实践中,你最好让客户端代码或报表工具来对数据进行透视。