如何在显示来自两个连接表的数据时更改分组?

时间:2016-07-08 18:02:43

标签: php mysql

我已根据客户ID值加入了两个表,客户和订单。 订单表中有多个条目具有相同的客户ID。

当我显示订单表的条目时,每个订单后面都有客户详细信息。 相反,我希望客户详细信息显示一次,然后显示所有具有该客户ID的订单。

如何使用PHP和MySQL做到这一点?

我希望输出像

Customer1_name 
Item 1  Quantity
Item 2  Quantity

Customer2_name
Item1  Quantity
Item2  Quantity

但我得到的是

Customer1_name 
item1 quantity
Customer1_name 
item2 quantity

如果他订购了2件物品

2 个答案:

答案 0 :(得分:0)

一般来说,像这样:

执行您的查询,首先按客户ID排序,然后按订单ID排序(或者您希望在每个客户部分内对订单进行排序)。首先ORDER BY customer_id 非常重要;如果不这样做,这种方法将不起作用。

$stmt = $pdo->query('SELECT * FROM customers 
    INNER JOIN orders ON customers.id = orders.customer_id ORDER BY customer_id, order_id');

在您获取结果时,跟踪客户,并在客户更改时输出新客户信息并将当前客户替换为新客户。

$customer_id = null;                          // current customer - initialize to null
while ($row = $stmt->fetchObject()) {
    if ($row->customer_id != $customer_id) {
        // customer is different, so start a new customer section
        echo $row->customer_name;
        $customer_id = $row->customer_id;    // reset the current customer
    }
    // always output your order information regardless of whether the customer has changed
    echo $row->order_info;
}

答案 1 :(得分:0)

使用GROUP_CONCAT()功能可以实现另一种方法,您只需获取一次客户详细信息,并以逗号分隔单独列中的其他订单详细信息。

考虑到我的表结构,我编写了以下查询,根据您的要求更改列名。

SELECT a.customer_id, a.cust_name, GROUP_CONCAT(b.item_name) FROM customers a 
INNER JOIN orders b ON a.customer_id = b.customer_id
GROUP BY a.customer_id