MySQL查询不会回来-性能增强?

MySQL查询不会回来-性能增强?,mysql,Mysql,我有一个shopware数据库,其结构如下: s_articles: all products id | name | mode s_order: all orders id | ordertime | userId | status s_order_details: all line items for an order id | orderId | articleId 现在我想做到以下几点:我想知道有多少用户在过去90天内购买了一款产品,而这些用户购买同一款产品的时间也早于过去90天

我有一个shopware数据库,其结构如下:

s_articles: all products
id | name | mode

s_order: all orders
id | ordertime | userId | status

s_order_details: all line items for an order
id | orderId | articleId

现在我想做到以下几点:我想知道有多少用户在过去90天内购买了一款产品,而这些用户购买同一款产品的时间也早于过去90天

我是这样做的:我得到所有的商品,然后统计90天前购买商品的所有客户,然后,我有另一个子选择和另一个子选择,我收集所有用户谁买了产品在过去的90天,并已购买它早于此,以及它保存在boughtLast90

然后我计算保留率。这适用于一个产品,但不适用于整个文章数据库。有没有什么方法可以在编写sql时考虑到更好的性能

我的查询如下所示:

select articleId, articleName, boughtBefore90, boughtLast90, boughtLast90/boughtBefore90 as 'retention'
FROM 

(select
    s_articles.id as 'articleId',
    s_articles.name as 'articleName',
    (select count(*)
        FROM s_order_details as s_order_details_2
        join s_order as s_order_2 on s_order_2.Id = s_order_details_2.orderId
        where s_order_details_2.articleId = s_articles.id
        and (s_order_2.status = 0 or s_order_2.status = 2)
        and s_order_2.ordertime > '2017-01-01 00:00:00'
        and s_order_2.ordertime <  '2017-03-09 23:59:59'
    ) as 'boughtBefore90',
    (select count(*) from s_order_details as s_order_details_3
        join s_order as s_order_3 on s_order_3.id = s_order_details_3.orderId 
        where s_order_3.ordertime > '2017-03-10 00:00:00'
        and s_order_3.ordertime < '2017-06-07 23:59:59'
        and s_order_details_3.articleId = s_articles.id
        and (s_order_3.status = 0 or s_order_3.status = 2)
        AND s_order_3.userId = (
            select DISTINCT(s_order_4.userId) from s_order_details as s_order_details_4
            join s_order as s_order_4 on s_order_4.id = s_order_details_4.orderId 
            where s_order_4.ordertime > '2017-01-01 00:00:00'
            and s_order_4.ordertime < '2017-03-09 23:59:59'
            and s_order_details_4.articleId = s_articles.id
            and s_order_3.userId = s_order_4.userId
            and (s_order_4.status = 0 or s_order_4.status = 2))
    ) as 'boughtLast90'
    from
    s_articles
    join s_order_details on s_order_details.articleID = s_articles.id
    join s_order on s_order.id = s_order_details.orderId
    WHERE s_articles.mode = 0
    AND s_order_details.modus = 0
    AND (s_order.status = 2 or s_order.status = 0)
    group by s_articles.id) as resulttable;

谢谢大家!

这似乎是一个非常简单的查询。以下是客户和文章列表:

select o.customerid, od.articleid
from s_orders o join
     s_order_details od
     on od.orderid = o.id
group by o.customerid, od.articleid
having max(o.ordertime) > curdate() - interval 90 days and
       min(o.ordertime) <= curdate() - interval 90 days;

如果需要计数,请将其用作子查询,并对客户/文章对使用count*,或对客户数使用countdistinct customerid。

请参阅:感谢您的快速回复。因此,这个查询向我提供了这个问题的最终结果,即在过去90天及之前,有多少客户购买了这篇文章。但现在我需要的数字是有多少人在90天之前买了它,然后除以你的结果。我不能在这里使用两个子选择,因为子选择中的s_articles.id未知。我该怎么做?我想知道在过去的90天里,有多少用户购买了同样的产品,而且比过去的90天还要早。