GROUP BY
не требуется, так как вы не используете агрегатную функцию (объединение двух строк значений в одно значение) , вы пытаетесь создать сводную таблицу, (объединениедва столбца под связанным столбцом в виде нескольких строк) .Вам нужно только ORDER BY detail ASC, data1 ASC
, выполнить итерацию по набору результатов, чтобы отобразить detail
при его изменении, в противном случае отобразить data1
и price
Запрос:
$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 для упорядочения значений так, как вы хотите, чтобы они отображались в вашем представлении, в организованном ассоциативном массиве.
$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 } ?>