Dans Mysql, ajoutez par lots plusieurs colonnes à la table en fonction d'une autre colonne
P粉336536706
2023-08-28 11:03:44
<p>J'ai un tableau à trois colonnes.
Pour chaque identifiant, nous avons jusqu'à 400 valeurs <code>index</code> Je souhaite ajouter des colonnes en fonction du nombre d'index. Dans l'exemple que j'ai fourni, j'ai 4 index puis j'ai ajouté quatre colonnes à la table. Voici le tableau que j'ai : </p>
<pre class="brush:php;toolbar:false;">Créer une table buy_sell (id int, idx varchar(255), sell float(2, 1));
insérer dans buy_sell (id, idx, sell) des valeurs ('1', 'a', '4');
insérer dans buy_sell (id, idx, sell) des valeurs ('1', 'b', '6');
insérer dans buy_sell (id, idx, sell) des valeurs ('1', 'c', '8');
insérer dans buy_sell (id, idx, sell) des valeurs ('1', 'd', '9');
insérer dans buy_sell (id, idx, sell) des valeurs ('3', 'b', '1');
insérer dans buy_sell (id, idx, sell) des valeurs ('3', 'c', '2');
insérer dans buy_sell (id, idx, sell) des valeurs ('2', 'a', '5');
insérer dans buy_sell (id, idx, sell) des valeurs ('2', 'b', '7');
insérer dans buy_sell (id, idx, sell) des valeurs ('2', 'd', '5');
SELECT * FROM buy_sell;</pre>
<p>Voici le résultat :</p>
<table class="s-table">
<tête>
<tr>
<th>id</th>
<th>idx</th>
<th>À vendre</th>
≪/tr>
≪/tête>
<corps>
<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>
</tcorps>
</tableau>
<p>Par exemple, pour id=1, nous avons ici quatre index (a, b, c, d), puis nous avons quatre colonnes non nulles.Pour id = 3 nous avons deux index (b, c) puis nous avons deux colonnes non nulles, donc pour la première colonne nous mettons zéro, pour la deuxième colonne nous mettons 1 et pour la troisième colonne nous plaçons 2. Etc., etc. Voici le tableau que je veux : </p>
<table class="s-table">
<tête>
<tr>
<th>id</th>
<th>Vendre 1</th>
<th>Vendre 2</th>
<th>Vendre 3</th>
<th>Vendre 4</th>
≪/tr>
≪/tête>
<corps>
<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>
</tcorps>
</tableau>
<p>J'ai beaucoup cherché et essayé <code>Group_concat</code>, <code>JSON_ARRAYAGG</code> etc. mais je n'ai pas trouvé de solution. Qu'est-ce que je dois faire? </p>
Le langage SQL a des exigences très strictes pour connaître le nombre de colonnes dans le résultat au moment de la compilation de la requête, avant d'examiner les données. Si vous devez examiner les données pour déterminer le nombre de colonnes souhaité, alors vous ne pouvez utiliser que du SQL dynamique (potentiellement dangereux), ce qui nécessite trois étapes :
Dans ce cas, vous ne savez pas combien de colonnes sont nécessaires, seulement qu'il s'agit de "jusqu'à 400 colonnes". Dans cet esprit, vous pourriez voir un code comme celui-ci :
Oui, vous devez spécifier quelque chose dans la requête pour chaque colonne possible. Cela suppose également votre
sell
值都大于0。如果你的值可能是正数和负数的混合,你可以尝试使用SUM()
而不是MAX()
.Cette approche est également directement contraire aux principes théoriques des bases de données relationnelles. En pratique, il est donc préférable de laisser le code client ou les outils de reporting faire pivoter les données.