我可以根据ID限制在PHP中显示结果集吗



假设我从mysql DB调用中得到了以下结果集(基本示例,main将有更多数据):

customerID   |   name     |     item     |     price
====================================================
11111        |   John     |    pizza     |   10.00
11111        |   John     |    burger    |   5.00
11111        |   John     |    drink     |   2.00
22222        |   Mike     |    lasagna   |   11.00
22222        |   Mike     |    drink     |   2.00
33333        |   Sam      |    burger    |   5.00
33333        |   Sam      |    fries     |   3.00
33333        |   Sam      |    shake     |   5.00
33333        |   Sam      |    drink     |   2.00

我想以表格形式显示结果,但限制customerID和名称的显示时间,并显示每个客户的小计:

customerID   |    name    |   item    |    price
===================================================
11111        |    John    |  pizza    |   10.00
             |            |  burger   |   5.00
             |            |  drink    |   2.00
             |            |           |   **17.00**
             |            |           |
22222        |    Mike    |  lasagna  |   11.00
             |            |  drink    |   2.00
             |            |           |   **13.00**
             |            |           |
33333        |    Sam     |  burger   |   5.00
             |            |  fries    |   3.00
             |            |  shake    |   5.00
             |            |  drink    |   2.00
             |            |           |   **15.00**

我知道我可以进行多个DB调用,但如果可以在一个数据库中完成,这是浪费。我在循环使用表1中的结果集以及使用表2中所示的PHP正确格式化时遇到了问题。是否有可能按照我显示的方式,或者我是否需要进行多次DB调用?

这最好直接在PHP中解决,因为您可以随心所欲地修改输出。

所以基本上你会做一些类似(未经测试)的事情:

$res = mysql_query("SELECT costumerID, name, item, price
                    FROM orders 
                    ORDER BY customerID, item");
echo "<table id='orders'>".
      "<tr><th>Name</th>".
      "<th>Item</th>".
      "<th>Price</th></tr>";
$lastCostumer = -1;
$subTotal = 0; 
while ($row = mysql_fetch_array($res))
     {
     // New costumer
     if ($lastCostumer != $row['costumerID'])
           {
           // Write the subtotal of previous costumer, unless this is the 1st one
           if ($lastCostumer != -1)
              echo "<tr><td></td>".
                   "<td></td>".
                   "<td><b>**".$subTotal."**</b></td></tr>";
           $subTotal = 0; 
           echo "<tr><td>".$row['name']."</td>".
                "<td>".$row['item']."</td>".
                "<td>".$row['price']."</td></tr>";
           $subTotal = $subTotal + $row['price'];
           $lastCostumer = $row['costumerID'];
           }
     else // Same costumer
           {
           echo "<tr><td></td>".  // Don't write the name
                "<td>".$row['item']."</td>".
                "<td>".$row['price']."</td></tr>";
           $subTotal = $subTotal + $row['price'];
           }
     }
// Write the subtotal of last costumer
echo "<tr><td></td>".
     "<td></td>".
     "<td><b>**".$subTotal."**</b></td></tr>";
echo "</table>";

您可以使用group_concat()来实现这一点。

SELECT id, name, GROUP_CONCAT(item) AS items, GROUP_CONCAT(price) AS prices, SUM(price) AS total FROM ... GROUP BY id

在这里,您可以获得以逗号分隔的字符串形式的项目和价格,还可以在另一列中获得合计。

group_concat可以有自己的订单,有关更多信息,请查看以下内容:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

您可以进行单个DB调用。只需在PHP中循环遍历结果并相应地输出表。换句话说,我不认为这是一个数据库问题,而是一个确定如何循环数据集和呈现HTML元素的问题。

您可以在(子)查询中使用CONCAT_WS运算符。使用'<br/>'作为水上飞机。然后按customerId分组。但是,CONCAT_WS的输出限制为1024个字符。

相关内容

  • 没有找到相关文章

最新更新