recherche

Maison  >  Questions et réponses  >  le corps du texte

Dans Mysql, ajoutez par lots plusieurs colonnes à la table en fonction d'une autre colonne

<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粉336536706P粉336536706445 Il y a quelques jours492

répondre à tous(1)je répondrai

  • P粉302484366

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

    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.

    répondre
    0
  • Annulerrépondre