我需要一个简单的SQL查询来显示一个虚拟/临时表,而不需要在数据库中创建它。
我使用PHP来创建带有数据的查询字符串。
我的当前PHP代码是:
$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;
它的输出是:
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
我从这里得到了这个查询的想法。
但是这个查询的问题是,如果$array中有100个数据,UNION ALL部分会在SQL中包含100次。我觉得这不是一个更好的SQL,因为它就像同时联合了100个表。
我也可以创建一个临时表(CREATE TEMPORARY TABLE table_name)来代替这个WITH子句,但这不是一个单一的查询,因为我需要另一个查询来将记录插入到临时表中。
有人可以帮我以更好的方式简化这个查询吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
当您使用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中,上述查询的结果如下: