【问题标题】:Php MySQL Looping through the loop? I am "overlooped"PHP MySQL 循环通过循环?我“过环”
【发布时间】:2018-02-11 21:39:19
【问题描述】:
table: car_cat
+-----+---------+
| id  | name    |
+-----+---------+
| 1   |sedan    |
| 2   |suv      |
| 3   |truck    |
+-----+---------+


table: Cars
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |         category       |      make    |  model  |    price    |
+-----+---------+------------------------+--------------+---------+-------------+
| 1   |01-01-18 |        sedan           |    ford      | taurus  |    15000    |
| 2   |01-01-18 |        sedan           |    ford      | fiesta  |    15000    |
| 3   |01-01-18 |        sedan           |    ford      | fucus   |    15000    |
| 4   |01-02-18 |        sedan           |    honda     | accord  |    25000    |
| 5   |01-02-18 |        sedan           |    bmw       | 535xi   |    35000    |
| 6   |01-03-18 |        suv             |    mercedes  | ml350   |    15000    |
| 7   |01-03-18 |        suv             |    mercedes  | gl350   |    35000    |
| 8   |01-03-18 |        suv             |    mercedes  | gle350  |    45000    |
| 9   |01-01-18 |        suv             |    chevrolet | suburban|    65000    |
| 10  |01-03-18 |        suv             |    chevrolet | tahoe   |    55000    |
| 11  |01-01-18 |          truck         |    ford      | f-150   |    45000    |
| 12  |01-01-18 |          truck         |    ford      | f-250   |    65000    |
| 13  |01-01-18 |          truck         |    ford      | f-350   |    85000    |
| 14  |01-01-18 |          truck         |    chevrolet |silverado|    85000    |
+-----+---------+------------------------+--------------+---------+-------------+

输出应该是:

类别:

*SEDANS(循环并计算仅来自一个品牌的所有汽车并计算它们)

FORD
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |     category           |    make      |  model  |    price    |
+-----+---------+------------------------+--------------+---------+-------------+
| 1   |01-01-18 |        sedan           |    ford      | taurus  |   15000 |
| 2   |01-01-18 |        sedan           |    ford      | fiesta  |   15000 |
| 3   |01-01-18 |        sedan           |    ford      | fucus   |   15000 |
+-----+---------+------------------------+--------------+---------+-------------+
total: 3 cars, total value $45,000

HONDA
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |   category     |    make  |  model  | price   |
+-----+---------+------------------------+--------------+---------+-------------+
| 4   |01-02-18 |        sedans          |    honda     | accord  |   25000 |
+-----+---------+------------------------+--------------+---------+-------------+
total: 1 car, total value $25,000

HONDA
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |   category     |    make  |  model  | price   |
+-----+---------+------------------------+--------------+---------+-------------+
| 5   |01-02-18 |        sedans          |    bmw       | 535xi   |   35000 |
+-----+---------+------------------------+--------------+---------+-------------+
total: 1 car, total value $35,000

*SUV

MERCEDES
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |   category     |    make  |  model  | price   |
+-----+---------+------------------------+--------------+---------+-------------+
| 6   |01-03-18 |        suv             |    mercedes  | ml350   |   15000 |
| 7   |01-03-18 |        suv             |    mercedes  | gl350   |   35000 |
| 8   |01-03-18 |        suv             |    mercedes  | gle350  |   45000 |
+-----+---------+------------------------+--------------+---------+-------------+
total: 3 cars, total value $95,000

CHEVROLET
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |   category     |    make  |  model  | price   |
+-----+---------+------------------------+--------------+---------+-------------+
| 9   |01-01-18 |        suv             |    chevrolet | suburban|   65000 |
| 10  |01-03-18 |        suv             |    chevrolet | tahoe   |   55000 |
+-----+---------+------------------------+--------------+---------+-------------+
total: 2 cars, total value $120,000

*卡车

FORD
+-----+---------+------------------------+--------------+---------+-------------+
| id  | date    |   category     |    make  |  model  | price   |
+-----+---------+------------------------+--------------+---------+-------------+
etc ....

基本上代码应该: 1:通读所有记录 2:将它们分组 3:将它们与特定组一起列出,同时计数。

$sql = "SELECT * FROM `car_cat` ORDER BY `name`";
$result = $mydb->runQuery($sql);
while($row = mysqli_fetch_array($result)) {
?>
    <table width="100%">
     <tr>
      <td colspan="6"><?php echo strtoupper($row['name']);?></td>
         </tr>  
    <tr>
     <th>id</th>
     <th>date</th>
     <th>category</th>
     <th>make</th>
     <th>model</th>
     <th>amount</th>
    </tr>
    <?php
    $catName = $row['name'];
    $sql_show = "SELECT * FROM `expenses` where `cat` = '$catName' ORDER BY `id` DESC";
    $result_show = $mydb->runQuery($sql_show);
    $showTotal = 0;         
    while($row_show = mysqli_fetch_array($result_show)) {
    ?>
    <tr>
      <td><?php echo $row_show['id'];?></td>
      <td><?php echo $row_show['date'];?></td>
      <td><?php echo $row_show['category'];?></td>
      <td><?php echo $row_show['make'];?></td>
      <td><?php echo $row_show['model'];?></td>
      <td>$<?php echo number_format((float)$row_show['price'], 2, '.', ',');?></td>
    </tr>
    <?php
    $showTotal = $showTotal + $row_show['amount'];
    } //while
    ?>
    <tr>
     <td colspan="4" align="right">TOTAL:</td>
     <td colspan="2" align="left">$<?php echo number_format((float)$showTotal, 2, '.', ','); ?></td>
    </tr>
       </table>     
<?php   
} //while
?>

但此代码仅按类别对其进行分组。它不会将制作组合在一起并为它们制作单独的表格。这就是我真正需要的。

谢谢

【问题讨论】:

  • 您的查询在哪里?
  • 会按要求做
  • 没有名称栏,用这个基本信息编辑问题请不要发表评论
  • 没有名称列,只有 id、日期、类别、品牌、型号和价格
  • 那你为什么有ORDER BY name ??

标签: php mysql nested-loops


【解决方案1】:

我正在为您的问题提交一个新答案。我能够为您的问题找到解决方案。我希望通过递归或不使用 3 个嵌套的 foreach 循环来看到更好的方法。这可能会运行得很慢,因为它是 O(n^3),但我不确定另一种方式。

我提供了一些屏幕截图和一个 JSFiddle,以确保这是您要求的结构:https://jsfiddle.net/Pimentelk/2duczuwd/

<?php

// Connect to the database:
$dbc = mysqli_connect('localhost', 'username', 'password', 'database', 'port');

// Retrieve all records:
$sql = 'SELECT id, date, category, make, model, price FROM cars ORDER BY category, make, model';
$results = mysqli_query($dbc, $sql);

// Init your array
$cars = array();

// Build a silly array
while (list($id, $date, $category, $make, $model, $price) = mysqli_fetch_array($results, MYSQLI_BOTH)) {
    $cars["$category"]["$make"][] = [
        'id'        => $id,
        'date'      => $date,
        'category'  => $category,
        'make'      => $make,
        'model'     => $model,
        'price'     => $price
    ];
}

// init some counter variables.
$count = 0;
$worth = 0;
?>

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<div class="container">
<?php foreach ($cars as $category => $makes) : ?>
    <h1 align="center"><?= $category ?></h1>

    <?php foreach ($makes as $make => $values) : ?>
        <h5><?= $make ?></h5>
        <table class="table table-bordered">
            <thead>
                <tr>
                    <th>id</th>
                    <th>date</th>
                    <th>category</th>
                    <th>make</th>
                    <th>model</th>
                    <th>price</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($values as $key => $value) : ?>
                    <tr>
                        <td><?= $value['id'] ?></td>
                        <td><?= $value['date'] ?></td>
                        <td><?= $value['category'] ?></td>
                        <td><?= $value['make'] ?></td>
                        <td><?= $value['model'] ?></td>
                        <td>&#36;<?= number_format($value['price']) ?></td>

                    </tr>
                    <?php $worth += $value['price'] ?>
                    <?php $count++; ?>
                <?php endforeach; ?>
            </tbody>
        </table>

        <p>total: <?= $count ?>, value: &#36;<?= number_format($worth) ?></p>
        <?php $count = 0 ?>
        <?php $worth = 0 ?>

        <?php endforeach; ?>
<?php endforeach; ?>

【讨论】:

  • 我正在寻找一个查询,该查询将列出按汽车类型分组的特定类别和计数
  • 这不会按类别分组,将计数作为总数。
  • 哇——几乎就是我问的。您可以将其更改为在每个品牌中计数吗?看看有多少像audi 这样的轿车可用。这将分别计算每个品牌。
  • 现在一切都完成了!使用 1500 条记录运行速度非常快。将标记您的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2015-05-21
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多