You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将键值型MySQL表转换为标准MySQL表?

这是典型的行转列需求,给你两种落地思路:

一、纯SQL实现(适合key值固定的场景)

因为你的key列取值是固定的(Age、Hair、Height、Sex),可以用GROUP BY配合CASE WHEN+聚合函数实现行转列,兼容性覆盖绝大多数关系型数据库:

SELECT 
    name,
    MAX(CASE WHEN `key` = 'Age' THEN value END) AS Age,
    MAX(CASE WHEN `key` = 'Hair' THEN value END) AS Hair,
    MAX(CASE WHEN `key` = 'Height' THEN value END) AS Height,
    MAX(CASE WHEN `key` = 'Sex' THEN value END) AS Sex
FROM your_table_name
GROUP BY name;

原理说明:GROUP BY name把同一个人的多条记录合并,MAX函数用来提取对应key的唯一值(因为同一个name+key仅一条数据,用MIN效果也一致)。如果你的数据库支持PIVOT语法(如SQL Server、Oracle),也可以用更简洁的PIVOT写法,但上面的代码兼容性更强。

二、PHP数组处理实现(适合key值动态变化的场景)

如果后续key可能新增或变动,用PHP处理更灵活。假设你已从数据库拿到原始二维数组$rawData,结构示例:

$rawData = [
    ['name' => 'Stephen', 'key' => 'Age', 'value' => '23'],
    ['name' => 'Stephen', 'key' => 'Hair', 'value' => 'Black'],
    // ... 其他数据
];

处理步骤:

  1. 构建以name为键的关联数组,整合同一用户的key-value对:
$transformed = [];
$headers = ['name']; // 初始化表头

foreach ($rawData as $item) {
    $name = $item['name'];
    $key = $item['key'];
    $value = $item['value'];
    
    // 初始化当前用户的数组
    if (!isset($transformed[$name])) {
        $transformed[$name] = ['name' => $name];
    }
    // 存入key-value
    $transformed[$name][$key] = $value;
    
    // 收集不重复的表头
    if (!in_array($key, $headers)) {
        $headers[] = $key;
    }
}
  1. 转成有序二维数组(方便输出表格):
$result = array_values($transformed);
  1. 最终$headers就是你需要的表头数组,$result是每行的用户数据,直接用来渲染表格即可。

内容的提问来源于stack exchange,提问作者howdoimysql

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:02:27