所以,我有一个名为clients
的表,另一个名为orders
的表和另外两个orders_type_a
和orders_type_b
。
我要做的是创建一个返回所有客户列表的查询,并且对于每个客户,它必须根据此客户的ID和该客户已花费的金额返回订单数。
而且......我不知道该怎么做。我知道这背后的逻辑,但无法找到如何将转换为MySQL查询。
我对MySQL有一个基本的 - thinkimgoodbutimnot 知识,但在这种情况下,我真的很困惑。
这是一张图片,以更好地说明我正在尝试的过程:
有用的额外信息:
orders
行只有一个type
(A
或B
)orders
行可以包含多个orders_type_X
(其中X为A
或B
)client_id
orders_type_X
通过orders
列order_id
相关联
今天正在通过查询检索客户端来进行此过程,然后从返回的每个条目中执行另一个查询(使用php)来检索订单,然后再检索另一个查询值。所以基本上对于从第一个查询返回的每一行,其中还有两个。毋庸置疑,这是一种可怕的方法,性能糟透了,这就是我想改变它的原因。
UPDATE宽度表格列
客户端:
id | name | phone
订单
id | client_id | date
orders_type_a:
id | order_id | number_of_items | price_of_single_item
orders_type_b:
id | order_id | number_of_shoes_11 | number_of_shoes_12 | number_of_shoes_13 | price_of_single_shoe
如需更多信息,请询问。
答案 0 :(得分:0)
如果我理解正确,你正在寻找这样的东西吗?
select c.*, SUM(oa.value) + SUM(ob.value) as total
from clients c
inner join orders o on c.order_id = o.id
inner join orders_type_a oa on oa.id = o.order_type_id AND o.type = 'A'
inner join orders_type_b ob on ob.id = o.order_type_id AND o.type = 'B'
group by c.id
我不知道你的实际字段名称,但这会返回每个客户的信息加上一个字段'total',其中包含A类和B类所有订单的值之和。您可能需要调整各种名称以使其发挥作用,但这是否能让你朝着正确的方向前进?
答案 1 :(得分:0)
Erik的回答是正确的。但是,由于每个订单可能有多个orders_type_a和orders_type_b记录,因此它更复杂一些:
SELECT c.id, c.name, c.phone, SUM(x.total) as total
FROM clients c
INNER JOIN orders o
ON o.client_id = c.id
INNER JOIN (
SELECT order_id, SUM(number_of_items * price_of_single_item) as total
FROM orders_type_a
UNION ALL
SELECT order_id, SUM((number_of_shoes_11 + number_of_shoes_12 + number_of_shoes_13) * price_of_single_shoe) as total
FROM orders_type_b
) x
ON x.order_id = o.id
GROUP BY c.id
;
我对如何根据orders_type_x表中的列计算总数做了一些假设。