繁体   English   中英

如何将子查询转换为联接?

[英]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 BYWEEK(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM