suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Demonstration des SQL-Ansatzes für virtuelle/temporäre Tabellen: Extrahieren von Daten aus einem assoziativen Array

<p>Ich benötige eine einfache SQL-Abfrage, um eine virtuelle/temporäre Tabelle anzuzeigen, ohne sie in der Datenbank zu erstellen. </p> <p>Ich verwende PHP, um eine Abfragezeichenfolge mit Daten zu erstellen. </p> <p>Mein aktueller PHP-Code ist: </p> <pre class="brush:php;toolbar:false;">$array = [ ['id' => 1, 'name' => ['id' => 2, 'name' => ['id' => 3, 'name' => ]; $subQuery = "SELECT {$array[0]['id']} AS col1, '{$array[0]['name']}' AS col2"; for ($i=1; $i < count($array); $i++) { $subQuery .= " UNION ALL SELECT {$array[$i]['id']}, '{$array[$i]['name']}'" } $sql = "WITH cte AS ( {$subQuery} ) SELECT col1, col2 FROM cte;"; echo $sql;</pre> <p>Die Ausgabe ist: </p> <pre class="brush:php;toolbar:false;">WITH cte AS ( SELECT 1 AS col1, 'one' AS col2 UNION ALL SELECT 2, 'two' UNION ALL SELECT 3, 'drei' ) SELECT col1, col2 FROM cte; // Ausgabetabelle aus dem SQL Spalte1 Spalte2 1 Eins 2 zwei 3 drei</pre> <p>Die Idee zu dieser Abfrage kam mir hier. </p> <p>Das Problem bei dieser Abfrage besteht jedoch darin, dass bei 100 Daten im $array der <strong>UNION ALL</strong>-Teil 100 Mal in die SQL aufgenommen wird. Ich glaube nicht, dass dies ein besseres SQL ist, weil es so ist, als würde man 100 Tabellen gleichzeitig verknüpfen. </p> <p>Anstelle dieser <strong>WITH</strong>-Klausel könnte ich auch eine temporäre Tabelle erstellen (<strong>CREATE TEMPORARY TABLE table_name</strong>), aber das wäre keine einzelne Abfrage, da ich Um Datensätze in die temporäre Tabelle einzufügen, ist eine weitere Abfrage erforderlich. </p> <p>Kann mir jemand helfen, diese Abfrage besser zu vereinfachen? </p>
P粉066224086P粉066224086481 Tage vor562

Antworte allen(1)Ich werde antworten

  • P粉781235689

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

    当您使用MySQL 8时,可以使用json_table表达式,如下所示:

    <?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;

    PHP在线编辑器

    在MySQL 8.0中,上述查询的结果如下:

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

    Antwort
    0
  • StornierenAntwort