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

如何将数据表同名称记录合并到同一行?MySQL/PHP实现问询

嘿,这个需求其实挺常见的——把行数据转成列展示,同时计算总小时数对吧?我给你两种靠谱的方案,纯MySQL查询或者用PHP处理,你可以根据自己的场景选:

方案一:纯MySQL查询实现

这种方案适合直接通过数据库返回你要的格式,不用额外处理数据。

情况1:日期是固定已知的

如果你的业务场景里,需要展示的日期是提前确定的(比如就你例子里的08-09-2019和09-09-2019),直接用条件聚合就能搞定:

SELECT 
    name,
    SUM(IF(date = '08-09-2019', hour, 0)) AS `08-09-2019(hour)`,
    SUM(IF(date = '09-09-2019', hour, 0)) AS `09-09-2019(hour)`,
    SUM(hour) AS totalhour
FROM your_table_name -- 替换成你的表名
GROUP BY name;

原理很简单:用IF判断每条记录的日期,匹配上就取对应的hour值,否则取0,再通过SUM按name分组求和,最后SUM(hour)直接算出总小时数。

情况2:日期是动态不确定的

如果后续会新增更多日期,固定写字段就太麻烦了,这时候可以用动态SQL自动生成列:

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
            'SUM(IF(date = ''', date, ''', hour, 0)) AS `', date, '(hour)`'
        )
    ) INTO @sql
FROM your_table_name; -- 替换成你的表名

SET @sql = CONCAT('SELECT name, ', @sql, ', SUM(hour) AS totalhour FROM your_table_name GROUP BY name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这段代码会先自动收集所有唯一的日期,把每个日期对应的聚合语句拼接成列,再组装成完整的查询语句执行,不管新增多少日期,都会自动生成对应的列。

方案二:PHP循环处理实现

如果MySQL的动态SQL对你来说有点复杂,或者需要更灵活的展示逻辑(比如调整日期顺序、处理空值),用PHP循环处理会更顺手:

步骤1:查询所有原始数据

先把表中所有记录查出来,不需要GROUP BY:

// 假设用PDO连接数据库,替换成你的数据库信息
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'your_username', 'your_password');
$stmt = $pdo->query("SELECT name, hour, date FROM your_table_name");
$rawData = $stmt->fetchAll(PDO::FETCH_ASSOC);

步骤2:整理数据结构

用foreach循环把原始数据按name分组,整理成我们需要的格式:

$processedData = [];
$allDates = []; // 收集所有唯一的日期

foreach ($rawData as $row) {
    $name = $row['name'];
    $date = $row['date'];
    $hour = (int)$row['hour'];

    // 初始化当前用户的记录
    if (!isset($processedData[$name])) {
        $processedData[$name] = [
            'name' => $name,
            'totalHour' => 0,
            'dateHours' => []
        ];
    }

    // 累加对应日期的小时数
    $processedData[$name]['dateHours'][$date] = isset($processedData[$name]['dateHours'][$date]) 
        ? $processedData[$name]['dateHours'][$date] + $hour 
        : $hour;
    
    // 累加总小时数
    $processedData[$name]['totalHour'] += $hour;

    // 收集唯一日期(避免重复)
    if (!in_array($date, $allDates)) {
        $allDates[] = $date;
    }
}

// 可选:按日期排序,让表头更整齐
sort($allDates);

步骤3:输出成目标格式

最后把整理好的数据输出成表格(或者你需要的其他格式):

// 输出表头
echo "<table border='1'>";
echo "<tr><th>name</th>";
foreach ($allDates as $date) {
    echo "<th>{$date}(hour)</th>";
}
echo "<th>totalhour</th></tr>";

// 输出每行数据
foreach ($processedData as $user) {
    echo "<tr><td>{$user['name']}</td>";
    foreach ($allDates as $date) {
        // 如果用户在该日期没有记录,显示0
        $displayHour = isset($user['dateHours'][$date]) ? $user['dateHours'][$date] : 0;
        echo "<td>{$displayHour}</td>";
    }
    echo "<td>{$user['totalHour']}</td></tr>";
}
echo "</table>";

两种方案各有优势:如果追求效率,优先用MySQL的方法;如果需要灵活调整展示逻辑,PHP处理会更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:57:07