Dans Mysql, ajoutez par lots plusieurs colonnes à la table en fonction d'une autre colonne
P粉336536706
P粉336536706 2023-08-28 11:03:44
0
1
508
<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>
P粉336536706
P粉336536706

répondre à tous(1)
P粉302484366

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 :

  1. Exécutez une requête pour trouver des informations sur la colonne requise.
  2. Créez dynamiquement une nouvelle instruction SQL en utilisant les résultats de l'étape 1.
  3. Exécutez le SQL à partir de l'étape 2.

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 :

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

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal