我有以下查询,效果很好。我有 2 个问题......
1) 我可以删除子查询上 order
的内部联接并将其重新绑定(bind)到主查询中吗?
2) 我需要将返回因素纳入所有生成的值中。每件商品的价格仅存储在 order_product
中。我的表结构如下...
订单
id | account_id | price | tax | shipping_price
订单产品
order_id | product_id | vehicle_id | quantity | price
我需要系统支持每个订单多个 RMA...
订单返回
id | status_id | order_id | account_id | timestamp
order_return_product
return_id | reason_id | product_id | vehicle_id | note | quantity
此查询生成销售统计信息,我需要它不考虑已退回的商品....
SELECT
SUM(price+shipping_price) AS total_sales,
COUNT(id) AS total_orders,
AVG(price+shipping_price) AS order_total_average,
(SELECT
SUM(quantity)
FROM `order_product`
INNER JOIN `order` ON (
`order`.id = order_product.order_id AND
`order`.created >= '.$startTimestamp.' AND
`order`.created <= '.$endTimestamp.' AND
`order`.type_id = '.$type->getId().' AND
`order`.fraud = 0
)
) AS total_units,
SUM(price+shipping_price)/'.$dateDifference['total']['days'].' AS daily_average
FROM `order`
WHERE created >= '.$startTimestamp.' AND
created <= '.$endTimestamp.' AND
fraud = 0 AND
type_id = '.$type->getId().'
最佳答案
我不太明白你为什么形成内部联接;您已经在查询 ORDER 表,因此可以引用其中的当前行。也许以下内容可以?
SELECT
SUM(price+shipping_price) AS total_sales,
COUNT(id) AS total_orders,
AVG(price+shipping_price) AS order_total_average,
(SELECT
SUM(quantity)
FROM `order_product`
WHERE `order`.id = order_product.order_id) AS total_units,
SUM(price+shipping_price)/'.$dateDifference['total']['days'].' AS daily_average
FROM `order`
WHERE created >= '.$startTimestamp.' AND
created <= '.$endTimestamp.' AND
fraud = 0 AND
type_id = '.$type->getId().'
编辑:好点,我忽略了这一点。我建议添加一个子查询来查找返回的总计,并在 Total_units 计算中减去该总计,也许按照以下方式...
SELECT
SUM(price+shipping_price) AS total_sales,
COUNT(id) AS total_orders,
AVG(price+shipping_price) AS order_total_average,
((SELECT SUM(quantity)
FROM `order_product`
WHERE `order`.id = order_product.order_id) -
(SELECT SUM (quantity)
FROM order_return, order_return_product
WHERE order_return.order_id = order.order_id AND
order_return.id = order_return_products.return_id))
AS total_units,
SUM(price+shipping_price)/'.$dateDifference['total']['days'].' AS daily_average
FROM `order`
WHERE created >= '.$startTimestamp.' AND
created <= '.$endTimestamp.' AND
fraud = 0 AND
type_id = '.$type->getId().'
关于MySQL 逻辑帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144129/