【问题标题】:How can I change the grouping when displaying data from two joined tables?显示来自两个连接表的数据时如何更改分组?
【发布时间】:2016-11-11 09:21:36
【问题描述】:

我在客户 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 件商品

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    一般来说是这样的:

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

    $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;
    }
    

    【讨论】:

      【解决方案2】:

      使用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
      

      【讨论】:

      • 是的!这样你就只能从 MySQL 获得整个结果。稍后您可以根据需要在 php 中显示输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2015-07-29
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多