搜索

首页  >  问答  >  正文

展示SQL虚拟/临时表的方法:从关联数组中提取数据

<p>我需要一个简单的SQL查询来显示一个虚拟/临时表,而不需要在数据库中创建它。</p> <p>我使用PHP来创建带有数据的查询字符串。</p> <p>我的当前PHP代码是:</p> <pre class="brush:php;toolbar:false;">$array = [ ['id' => 1, 'name' => 'one'], ['id' => 2, 'name' => 'two'], ['id' => 3, 'name' => 'three'] ]; $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>它的输出是:</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, 'three' ) SELECT col1, col2 FROM cte; // Output table from the SQL col1 col2 1 one 2 two 3 three</pre> <p>我从这里得到了这个查询的想法。</p> <p>但是这个查询的问题是,如果$array中有100个数据,<strong>UNION ALL</strong>部分会在SQL中包含100次。我觉得这不是一个更好的SQL,因为它就像同时联合了100个表。</p> <p>我也可以创建一个临时表(<strong>CREATE TEMPORARY TABLE table_name</strong>)来代替这个<strong>WITH</strong>子句,但这不是一个单一的查询,因为我需要另一个查询来将记录插入到临时表中。</p> <p>有人可以帮我以更好的方式简化这个查询吗?</p>
P粉066224086P粉066224086481 天前564

全部回复(1)我来回复

  • 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 |
    +----+-------+

    回复
    0
  • 取消回复