MySQL查询不会回来-性能增强?
我有一个shopware数据库,其结构如下: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天
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天还要早。