[英]How to convert sub query to joins?
我在我的opencart网站中使用此查询
SELECT MIN(tmp.date_added) AS date_start,
MAX(tmp.date_added) AS date_end,
COUNT(tmp.order_id) AS `orders`,
SUM(tmp.products) AS products,
SUM(tmp.tax) AS tax,
SUM(tmp.total) AS total
FROM
( SELECT o.order_id,
( SELECT SUM(op.quantity)
FROM `oc_order_product` op
WHERE op.order_id = o.order_id
GROUP BY op.order_id
) AS products,
( SELECT SUM(ot.value)
FROM `oc_order_total` ot
WHERE ot.order_id = o.order_id
AND ot.code = 'tax'
GROUP BY ot.order_id
) AS tax,
o.total,
o.date_added
FROM `oc_order` o
WHERE o.order_status_id > '0'
AND DATE(o.date_added) >= '2015-03-01'
AND DATE(o.date_added) <= '2016-04-19'
GROUP BY o.order_id
) tmp
GROUP BY WEEK(tmp.date_added)
ORDER BY tmp.date_added DESC
LIMIT 0,60
WEEK
的第一WEEK
会打first-将有两个部分的星期。
我们现在处于2016年的“第16周”。这对应于2015年略有不同的日子; 你想把它们结合起来吗?
由于这些打嗝WEEK
,可要改变最终ORDER BY
于WEEK(tmp.date_added) DESC
FROM ( SELECT ... )
可能很好。 那是你要问的吗?
两个( SELECT SUM ... ) AS ...
可能是最佳的,或者几乎是最佳的。 那是你要问的吗?
但是,您可能确实需要一些索引:
oc_order_total: INDEX(code, order_id) -- in that order
oc_order_product: INDEX(order_id)
将DATE(o.date_added) >= '2015-03-01'
更改为o.date_added >= '2015-03-01'
(etc),以便可以使用INDEX(date_added)
。
如果只能为'1': o.order_status_id > '0'
,则将其更改为o.order_status_id = 1
以便可以使用INDEX(order_status_id, date_added)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.