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

Démonstration de l'approche de table virtuelle/temporaire SQL : extraction de données à partir d'un tableau associatif

<p>J'ai besoin d'une simple requête SQL pour afficher une table virtuelle/temporaire sans la créer dans la base de données. </p> <p>J'utilise PHP pour créer une chaîne de requête avec des données. </p> <p>Mon code PHP actuel est : </p> <pre class="brush:php;toolbar:false;">$array = [ ['id' => 1, 'nom' => ['id' => 2, 'nom' => ['id' => 3, 'nom' => ]; $subQuery = "SELECT {$array[0]['id']} AS col1, '{$array[0]['name']}' AS col2"; pour ($i=1; $i < count ($array); $i++) { $subQuery .= " UNION ALL SELECT {$array[$i]['id']}, '{$array[$i]['name']}'" } $sql = "AVEC cte AS ( {$sous-requête} ) SELECT col1, col2 FROM cte;"; echo $sql;</pre> <p>Sa sortie est : </p> <pre class="brush:php;toolbar:false;">AVEC cte AS ( SELECT 1 AS col1, 'un' AS col2 UNION ALL SELECT 2, 'deux' UNION ALL SELECT 3, 'trois' ) SELECT col1, col2 FROM cte; // Table de sortie du SQL col1 col2 1 un 2 deux 3 trois≪/pre> <p>J'ai eu l'idée de cette requête à partir d'ici. </p> <p>Mais le problème avec cette requête est que s'il y a 100 données dans $array, la partie <strong>UNION ALL</strong> sera incluse 100 fois dans le SQL. Je ne pense pas que ce soit un meilleur SQL car c'est comme rejoindre 100 tables en même temps. </p> <p>Je pourrais également créer une table temporaire (<strong>CREATE TEMPORARY TABLE table_name</strong>) à la place de cette clause <strong>WITH</strong> Une autre requête est nécessaire pour insérer des enregistrements dans la table temporaire. </p> <p>Quelqu'un peut-il m'aider à mieux simplifier cette requête ? </p>
P粉066224086P粉066224086382 Il y a quelques jours483

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

  • P粉781235689

    P粉7812356892023-09-04 00:48:43

    Lorsque vous utilisez MySQL 8, vous pouvez utiliser json_table des expressions comme celle-ci :

    <?php
    $array = [
        ['id' => 1, 'name' => 'one'],
        ['id' => 2, 'name' => 'two'],
        ['id' => 3, 'name' => 'three']
    ];
    
    $data = json_encode($array);
    
    $sql = "SELECT tbl.* 
    FROM JSON_TABLE(
            '{\"data\":$data}',
            '$.data[*]' COLUMNS (
                    id VARCHAR(40)  PATH '$.id',
                    name VARCHAR(100) PATH '$.name')
         ) tbl";
    
    echo $sql;

    Éditeur PHP en ligne

    Dans MySQL 8.0, les résultats de la requête ci-dessus sont les suivants :

    +====+=======+
    | id | name  |
    +====+=======+
    | 1  | one   |
    +----+-------+
    | 2  | two   |
    +----+-------+
    | 3  | three |
    +----+-------+

    répondre
    0
  • Annulerrépondre