首页 文章

我应该如何处理sql和php中的自定义GROUP BY?

提问于
浏览
0

我希望通过(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,如下所示:

Controller :

$d['data'] = $this->db->query("select detail_item, GROUP_CONCAT (detail) detail_lunch 
            from table ORDER BY detail_lunch ASC");

Views :

<?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++;
    }
?>

我上面的代码不起作用,有什么建议可以解决我的问题吗?

谢谢...

2 回答

  • -1

    由于您没有使用聚合函数(将两行值合并为单个值),因此不需要 GROUP BY ,您正在尝试创建数据透视表(将相关列下的两列连接为多行) . 您只需要 ORDER BY detail ASC, data1 ASC ,迭代结果集以在更改时显示 detail ,否则显示 data1price

    示例:https://3v4l.org/7tVDS

    Query:

    $data = $this->db->query('SELECT data1, detail, price 
            FROM table ORDER BY detail ASC, data1 ASC');
    

    View:

    <?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>&nbsp;</td>
        </tr>
     <?php } ?>
     <!-- Always show the data1/price on subsequent row -->
      <tr>
           <td>&nbsp;</td>
           <td>- <?php echo $d['data1']; ?></td>
           <td><?php echo $d['price']; ?></td>
      </tr>
    <?php 
        $currentDetail = $d['detail'];
    } ?>
    

    Result:

    | 1 | Food |
    | - ID1 | $ 100 |
    | 2 | Drink |
    | - ID1 | $ 25 |
    | - ID2 | $ 25 |
    | 3 | Snack |
    | - ID1 | $ 50 |
    | - ID2 | $ 50 |
    

    或者,您可以操纵数据在视图中的显示方式,例如在详细信息表列_56120中使用无序列表 ul 以及价格 . 通过使用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 } ?>
    
  • 1

    查询是问题所在 . 从表组中选择detail_lunch详细信息 . 然后,您可以对该结果使用if语句 . 我开始在计算机上工作后,我会更新我的答案 .

相关问题