问题描述
我正在为COVID期间向弱势群体提供食物的一群当地企业做一些志愿工作。
订单示例:
Order No | Customer Name | Address | Quantity | Item Name | Notes
===================================================
#1234 | Freda Smith |3 High St | 1 | Loaf Bread | Wholemeal
#1234 | Freda Smith |3 High St | 2 | 500ml Milk | Skimmed
#1234 | Freda Smith |3 High St | 1 | Tea | Eng. Breakfast
我需要将订单号#1234的所有详细信息打印到一张票证上,
#1234,Freda Smith,3 High St
1 X Loaf Bread,Wholemeal
2 X 500ml Milk,skimmed
1 X Tea,Eng. Breakfast
我喜欢CONCAT
和CONCAT_GROUP
,并试图通过将SELECT
与HTML格式分开来解决问题,但无法获得所需的内容。我很近但是没有雪茄!
编辑:
SELECT IS: $sql = "SELECT id,Order_Number,Full_Name,Address,Time_To_Deliver,CONCAT(Quantity,Item_Name,Notes)
FROM orders
CONCAT_GROUP BY Order_Number";
$users = $MysqLi->query($sql);
while($user = $users->fetch_assoc()){
解决方法
您当前的设计中有多余的数据,您应该通过为订单和订单项维护单独的表来normalize数据库结构,并且还可以添加客户表。
根据您当前的设计,您可以遍历所有行并有条件地显示每个订单号。只有一次。
select id,order_number,full_name,address,time_to_deliver,quantity,item_name,notes
from orders
order by order_number asc
这里的order by
子句很重要,因此您将获得每个订单的有序列表。获得查询的所有结果后,您可以按以下方式遍历数据
$currentParent = false;
while ($orderItem = $result->fetch_assoc()) {
if ($currentParent != $orderItem['order_number']) {
// display common detail of each order here
echo '<h1>' . $orderItem['order_number'] .' '. $orderItem['full_name'] .' '. $orderItem['address']'</h1>';
$currentParent = $orderItem['order_number'];
}
echo '<p>' . $orderItem['quantity'] .' '. $orderItem['item_name'] . ' '. $orderItem['notes'] .'</p>'; // here list rest of the information of order iterms
...
}
生成的标记将类似于
<h1>#1234,Freda Smith,3 High St</h1>
<p>1 X Loaf Bread,Wholemeal</p>
<p>2 X 500ml Milk,skimmed </p>
<h1>#1235,3 High St</h1>
<p>1 X Tea,Eng. Breakfast</p>
//....
尽管您可以直接在数据库级别对group_concat
(请参阅Query for post and tags in same query
)使用聚合,但是它具有字符数限制的限制,可以调整字符数限制,但是在处理这种类型时不是一个很好的方法应用层的情况