Php MySQL pivot将一行变成一列

Php MySQL pivot将一行变成一列,php,mysql,sql,pivot,Php,Mysql,Sql,Pivot,我有三张表,产品,客户,订单 产品: id | name | 1 | milk | 2 | bread| 3 | Pea | 客户: id | name | category 1 | James | retailer 2 | Paul | vendor 3 | Dave | retailer 订单: id | product_id | customer_id | qty | price 1 | 1 | 2 | 23 | 50

我有三张表,
产品
客户
订单

产品:

id | name |
 1 | milk |
 2 | bread|
 3 | Pea  |
客户:

id | name  | category
1  | James | retailer
2  | Paul  | vendor
3  | Dave  | retailer
订单:

id  | product_id | customer_id | qty | price
 1  | 1          | 2           | 23  | 50 
 2  | 2          | 2           | 4   | 30
 3  | 3          | 2           | 6   | 10
 4  | 2          | 1           | 9   | 30
 5  | 3          | 1           | 2   | 10
 6  | 1          | 3           | 6   | 50
 7  | 3          | 3           | 7   | 10
当我执行查询以显示类别为
vendor
like的客户的交易时

从客户、产品、订单中选择customer.name、product.name作为pname、order.qty、order.price
其中customer.id=order.customer\u id
和product.id=order.product\u id和customer.category=“供应商”
我会得到类似于:

name |  pname | qty | price
Paul |  milk  | 23  | 50
Paul |  bread | 4   | 30
Paul |  pea   | 6   | 10
我想要这个:

name | milk  | bread  | pea  | total
Paul | 23    | 4      | 6    | 90
name  | milk  | bread  | pea  | total
James | 0     |  9     | 2    | 40
Dave  | 6     |  0     | 7    | 60
而零售商的情况将如下所示:

 name |  pname | qty | price
James |  bread | 9   | 30
James |  pea   | 2   | 10
 Dave |  milk  | 6   | 50
 Dave |  pea   | 7   | 10
选择customer.name、product.name作为pname、order.qty、order.price FROM
顾客、产品、订单
其中customer.id=order.customer\u id
和product.id=order.product\u id和customer.category=“零售商”
我会得到一张这样的桌子:

 name |  pname | qty | price
James |  bread | 9   | 30
James |  pea   | 2   | 10
 Dave |  milk  | 6   | 50
 Dave |  pea   | 7   | 10
但是我想要这个:

name | milk  | bread  | pea  | total
Paul | 23    | 4      | 6    | 90
name  | milk  | bread  | pea  | total
James | 0     |  9     | 2    | 40
Dave  | 6     |  0     | 7    | 60

我认为你不能直接从一个简单的选择中得到这个响应结构

name  | milk  | bread  | pea  | total
James | 0     |  9     | 2    | 40
Dave  | 6     |  0     | 7    | 60
因为您的数据库正在获取每个零售商/客户订单的一行


我知道,使用PHP或Java等服务器语言,您可以处理数据并检索所需的数据。

只需使用条件聚合来旋转列即可。并且一定要使用显式连接,而不是不推荐使用的隐式连接,因为在ANSI-92中,隐式连接已经是25年来的标准

选择c.name,
总和(当p.name=‘milk’时,则为o.qty,否则为0结束)作为milk,
总和(当p.name=面包时,则为o.qty,否则为0结束)作为面包,
总和(当p.name='pea'然后o.qty否则0结束时的情况)为pea,
总金额(o.价格)
从'customer'c
内部联接'order'o
在c.id=o.customer\u id上
内连接`product`p
在p.id=o.product\U id上
其中c.category=‘供应商’——与零售商相同
按c.name分组

相关:太棒了!正是我需要的。谢谢