展示SQL虚拟/临时表的方法:从关联数组中提取数据
P粉066224086
P粉066224086 2023-09-03 16:26:28
[PHP讨论组]

我需要一个简单的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子句,但这不是一个单一的查询,因为我需要另一个查询来将记录插入到临时表中。

有人可以帮我以更好的方式简化这个查询吗?

P粉066224086
P粉066224086

全部回复(1)
P粉781235689

当您使用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 |
+----+-------+
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号