php - 我应该如何处理 sql 和 php 中的自定义 GROUP BY?
问题描述
我想按(SQL)分组。就我而言,我想在来自两个不同列的组详细信息中进行分类详细信息,有关更多详细信息,请查看:
我有这样的 sql 表:
+----+-------+--------+-------+
| No | data1 | detail | price |
+----+-------+--------+-------+
| 1 | ID1 | Food | $ 100 |
| 2 | ID1 | Drink | $ 25 |
| 3 | ID2 | Drink | $ 25 |
| 4 | ID1 | Snack | $ 50 |
| 5 | ID2 | Snack | $ 50 |
+----+-------+--------+-------+
我想在我的 php 页面中生成这样的结果:
+----+-------+--------+-------+
| No | detail_lunch | price |
+----+-------+--------+-------+
| 1 | Food | |
| | - ID1 | $ 100 |
| 2 | Snack | |
| | - ID1 | $ 25 |
| | - ID2 | $ 25 |
| 3 | Drink | |
| | - ID1 | $ 10 |
| | - ID2 | $ 10 |
+----+-------+--------+-------+
我已经尝试使用 GROUP CONCAT 如下:
控制器 :
$d['data'] = $this->db->query("select detail_item, GROUP_CONCAT (detail) detail_lunch
from table ORDER BY detail_lunch ASC");
意见:
<?php
foreach($data->result_array() as $d)
{
?>
<tr>
<td><?php echo $no; ?></td>
<td><?php echo $d['detail_lunch']; ?></td>
<td><?php echo $d['price']; ?></td>
</tr>
<?php
$no++;
}
?>
我上面的代码不起作用,有什么建议可以解决我的问题吗?
谢谢...
解决方案
GROUP BY
不需要,因为您没有使用聚合函数(将两行值组合成一个值),您正在尝试创建一个数据透视表,(将相关列下的两列连接为多行)。您只需要ORDER BY detail ASC, data1 ASC
, 遍历结果集以显示它detail
何时更改,否则显示data1
andprice
示例:https ://3v4l.org/7tVDS
询问:
$data = $this->db->query('SELECT data1, detail, price
FROM table ORDER BY detail ASC, data1 ASC');
看法:
<?php
//...
$no = 1;
$currentDetail = null;
foreach ($data->result_array() as $d) {
if ($d['detail'] !== $currentDetail) { ?>
<!-- Only Show the Detail when changed -->
<tr>
<td><?php echo $no++; ?></td>
<td><?php echo $d['detail']; ?></td>
<td> </td>
</tr>
<?php } ?>
<!-- Always show the data1/price on subsequent row -->
<tr>
<td> </td>
<td>- <?php echo $d['data1']; ?></td>
<td><?php echo $d['price']; ?></td>
</tr>
<?php
$currentDetail = $d['detail'];
} ?>
结果:
| 1 | Food |
| - ID1 | $ 100 |
| 2 | Drink |
| - ID1 | $ 25 |
| - ID2 | $ 25 |
| 3 | Snack |
| - ID1 | $ 50 |
| - ID2 | $ 50 |
或者,您可以控制数据在视图中的显示方式,例如在明细表列中使用无序列表ul
和td
价格。通过使用 PHP 来组织值,您希望它们在视图中以有组织的关联数组的方式显示。
示例:https ://3v4l.org/8sIrR
$dataArray = [];
foreach ($data as $d) {
if (!array_key_exists($d['detail'], $dataArray)) {
$dataArray[$d['detail']] = [];
}
$dataArray[$d['detail']][] = $d;
}
//...
$no = 1;
foreach ($dataArray as $detail => $d) { ?>
<tr>
<td><?php echo $no++; ?></td>
<td>
<?php echo $detail; ?>
<ul>
<?php foreach ($d as $v) { ?>
<li><?php echo $v['data1']; ?> <?php echo $v['price']; ?></li>
<?php } ?>
</ul>
</td>
</tr>
<?php } ?>
推荐阅读
- amazon-web-services - 如何将主机标头转发到 CloudFront UI 中的源?
- regex - 正则表达式排除子字符串
- angular - 子模块中的角度多条路线
- javascript - i18nProvider 为默认语言环境的消息返回了一个 Promise。反应管理员
- python - Pandas groupby 根据排名保留行
- octave - Octave 有画垂直线的 xline 功能吗?
- javascript - 通过过渡每分钟更改背景图像
- c# - 如何制作一半“RadialProgressBar”
- amazon-web-services - 检查哪些 ebextensions 已运行
- java - 将 Spring Boot 应用程序推送到 Heroku 未完成