如何在CodeIgniter中实现MySQL表按vname分组展示cname数据
按vname分组展示cname的实现方案
首先,先明确你的数据源和期望效果:
原表数据
你的MySQL表结构和数据如下:
| cname | vname | curl |
|---|---|---|
| A | 1 | url1 |
| A | 2 | url2 |
| B | 1 | url3 |
| B | 3 | url4 |
| C | 2 | url5 |
| C | 3 | url5 |
| C | 4 | url6 |
| D | 2 | url7 |
期望输出
你想要把数据转成按vname作为列,同一列下的cname按行排列的表格:
| 1 | 2 | 3 | 4 |
|---|---|---|---|
| A | A | B | C |
| B | C | C | |
| D |
你已尝试的CodeIgniter代码
你提到已经写了部分查询代码:
$this->db->distinct(); $this->db->select('vname, cname, curl'); $this->db->from('tablename'); // 这里假设你填写了完整表名
接下来我给你完整的实现思路和代码:
步骤1:从数据库获取并整理数据
首先我们需要先拿到所有唯一的vname(作为表格的表头),然后把每个vname对应的cname分组存起来:
// 获取所有排序后的唯一vname $vnameQuery = $this->db->select('DISTINCT vname') ->from('tablename') ->order_by('vname', 'ASC') ->get(); $vnameList = array_column($vnameQuery->result_array(), 'vname'); // 获取所有vname和cname的对应关系 $dataQuery = $this->db->select('vname, cname') ->from('tablename') ->order_by('vname', 'ASC') ->get(); $rawData = $dataQuery->result_array(); // 按vname分组cname,若需去重可添加array_unique逻辑 $groupedData = []; foreach ($rawData as $item) { $v = $item['vname']; if (!isset($groupedData[$v])) { $groupedData[$v] = []; } // 可选:如果要去重同一vname下的cname,取消下面注释即可 // if (!in_array($item['cname'], $groupedData[$v])) { $groupedData[$v][] = $item['cname']; // } }
步骤2:构建表格的行数据
我们需要找到分组后最多的cname数量,以此作为表格的行数,然后逐行填充每个列的内容:
// 计算最大行数 $maxRowCount = 0; foreach ($groupedData as $cnames) { $maxRowCount = max($maxRowCount, count($cnames)); } // 生成每一行的内容 $tableRows = []; for ($i = 0; $i < $maxRowCount; $i++) { $currentRow = []; foreach ($vnameList as $vname) { // 存在对应位置的cname就取值,否则留空 $currentRow[] = isset($groupedData[$vname][$i]) ? $groupedData[$vname][$i] : ''; } $tableRows[] = $currentRow; }
步骤3:在视图中渲染表格
最后把$vnameList和$tableRows传到视图里,渲染成表格:
<table border="1"> <thead> <tr> <?php foreach ($vnameList as $v): ?> <th><?= $v ?></th> <?php endforeach; ?> </tr> </thead> <tbody> <?php foreach ($tableRows as $row): ?> <tr> <?php foreach ($row as $cell): ?> <td><?= $cell ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> </tbody> </table>
这样就能得到你想要的展示效果了。如果有特殊需求(比如调整排序规则、过滤特定数据),可以在分组数据的环节做对应的修改。
内容的提问来源于stack exchange,提问作者ITSagar
相关产品推荐
相关产品推荐

