PHP多数据展示问题:如何按办公区分组展示对应楼层信息
解决分组后仅显示单条楼层数据的问题
你的问题出在原SQL的GROUP BY floor_hall.o_id上——分组后,每个办公室(o_id)只会返回一条floor_hall表的记录,所以无法获取同区域下的所有楼层信息。下面提供两种修改方案:
方案一:PHP端分组处理(推荐)
先查询所有关联数据,再在PHP中按办公室分组整理,这种方式更灵活,不受SQL函数限制:
修改后的SQL
SELECT office_hall.office_name, floor_hall.f_name FROM floor_hall INNER JOIN office_hall ON office_hall.o_id = floor_hall.o_id ORDER BY office_hall.o_id
修改后的PHP代码
$result = mysqli_query($conn, $query); // 按办公室名称分组存储楼层数据 $officeData = []; while ($row = mysqli_fetch_assoc($result)) { $officeName = $row['office_name']; $floorName = $row['f_name']; // 初始化分组数组 if (!isset($officeData[$officeName])) { $officeData[$officeName] = [ 'count' => 0, 'floors' => [] ]; } $officeData[$officeName]['count']++; $officeData[$officeName]['floors'][] = $floorName; } // 按需求格式输出 foreach ($officeData as $name => $info) { echo "Area: $name, Count: {$info['count']},\n"; foreach ($info['floors'] as $floor) { echo "$floor\n"; } echo "\n"; // 区域间空行分隔 }
方案二:SQL用GROUP_CONCAT拼接楼层
通过SQL的GROUP_CONCAT函数将同办公室的楼层拼接成字符串,再在PHP中拆分输出:
修改后的SQL
SELECT office_hall.office_name, COUNT(floor_hall.o_id) as count, GROUP_CONCAT(floor_hall.f_name SEPARATOR '|') as floors FROM floor_hall INNER JOIN office_hall ON office_hall.o_id = floor_hall.o_id GROUP BY floor_hall.o_id
修改后的PHP代码
$result = mysqli_query($conn, $query); while ($row = mysqli_fetch_assoc($result)) { $officeName = $row['office_name']; $count = $row['count']; // 拆分拼接的楼层字符串 $floors = explode('|', $row['floors']); echo "Area: $officeName, Count: $count,\n"; foreach ($floors as $floor) { echo "$floor\n"; } echo "\n"; }
注意事项
方案二中,GROUP_CONCAT有默认长度限制(默认1024字符),如果你的楼层名称较多或较长,可能需要修改MySQL的group_concat_max_len配置来避免截断。
内容的提问来源于stack exchange,提问作者Jonjon Castilleja
相关产品推荐
相关产品推荐

