假设我从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个字符。