如何将数据表同名称记录合并到同一行?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
相关产品推荐
相关产品推荐

