MySQL与PHP实现同一encounter仅显一次、对应多mode展示的可行性问询
问题描述
我不确定是否可行,但想咨询:我的MySQL数据库里有个raid_list表,包含encounter、mode、encounter_id字段。比如encounter_id为4时,encounter值是"Crota"(对应多条记录),mode分别是"Normal"和"Master",能不能在echo输出时只显示一次"Crota",同时把这两个mode值都展示出来?
当前用的查询语句:
$ce = $database->pdo->query("SELECT * FROM `raid_list` WHERE `raid_id` = 13 ORDER BY `encounter_id` ASC")->fetchAll(PDO::FETCH_ASSOC);
PHP代码:
<?php foreach($ce as $data) { echo '<div class="encounter">'; echo '<p>' . $data['encounter'] . '</p>'; echo '<p>(' . $data['mode'][0] . ')</p>'; echo '</div>'; } ?>
附数据库截图:显示表中同一encounter_id对应不同mode的多条记录
解决方案
当然可以实现,提供两种常用方法:
方法一:SQL聚合查询(推荐)
利用MySQL的GROUP_CONCAT函数,将同一encounter_id(或encounter)对应的所有mode合并成一个字符串,这样查询结果每条记录对应唯一的encounter,直接输出即可。
修改后的SQL查询:
SELECT encounter_id, encounter, GROUP_CONCAT(DISTINCT mode SEPARATOR ', ') AS modes FROM `raid_list` WHERE `raid_id` = 13 GROUP BY encounter_id, encounter ORDER BY encounter_id ASC
对应的PHP输出代码:
<?php foreach($ce as $data) { echo '<div class="encounter">'; echo '<p>' . $data['encounter'] . '</p>'; echo '<p>(' . $data['modes'] . ')</p>'; echo '</div>'; } ?>
方法二:PHP分组处理
如果不想修改SQL,可以在PHP中先对查询结果按encounter_id分组,再遍历分组后的数据输出。
示例代码:
<?php // 第一步:按encounter_id分组整理数据 $groupedData = []; foreach($ce as $item) { $id = $item['encounter_id']; if (!isset($groupedData[$id])) { $groupedData[$id] = [ 'encounter' => $item['encounter'], 'modes' => [] ]; } $groupedData[$id]['modes'][] = $item['mode']; } // 第二步:遍历分组后的数据输出 foreach($groupedData as $data) { echo '<div class="encounter">'; echo '<p>' . $data['encounter'] . '</p>'; echo '<p>(' . implode(', ', $data['modes']) . ')</p>'; echo '</div>'; } ?>
内容的提问来源于stack exchange,提问作者Dodofury
相关产品推荐
相关产品推荐

