从多个关联表中检索值

时间:2013-11-19 15:52:06

标签: php mysql sql

所以,我有一个名为clients的表,另一个名为orders的表和另外两个orders_type_aorders_type_b

我要做的是创建一个返回所有客户列表的查询,并且对于每个客户,它必须根据此客户的ID和该客户已花费的金额返回订单数。

而且......我不知道该怎么做。我知道这背后的逻辑,但无法找到如何转换为MySQL查询。

我对MySQL有一个基本的 - thinkimgoodbutimnot 知识,但在这种情况下,我真的很困惑。

这是一张图片,以更好地说明我正在尝试的过程: The logic behind the query

有用的额外信息:

  • 每个orders行只有一个typeAB
  • 每个orders行可以包含多个orders_type_X(其中X为AB
  • 订单通过列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

如需更多信息,请询问。

2 个答案:

答案 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表中的列计算总数做了一些假设。