0

假设我从 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 和 name 出现的时间,以及显示每个客户的小计:

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**

我知道我可以进行多个数据库调用,但是如果可以一次性完成,那就太浪费了。我在表 1 中的结果集循环和使用 PHP 正确格式化时遇到问题,如表 2 所示。我有可能显示它的方式还是我必须进行多个数据库调用才能这样做?

4

4 回答 4

1

您可以使用 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

于 2012-07-23T16:51:05.553 回答
1

这最好直接在 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>";
于 2012-07-23T17:08:48.780 回答
0

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

于 2012-07-23T16:50:28.737 回答
0

您可以在(子)查询中使用 CONCAT_WS 运算符。用作'<br/>'海分离器。然后按客户 ID 分组。但是,CONCAT_WS 的输出限制为 1024 个字符。

于 2012-07-23T16:52:48.887 回答