私は構造を有しているshopwareデータベースを持っている:MySQLのクエリが戻って来ていない - パフォーマンスの拡張?
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日前に商品を購入したすべての顧客を集計します。"boughtBefore90"
、次に別のサブセレクト最後の90日間に製品を購入し、以前に購入したユーザーも"boughtLast90"
に保存してください。
次に、保持率を計算します。これは1つの製品でうまく動作しますが、記事データベース全体では機能しません。より良いパフォーマンスを念頭に置いてこの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;
ありがとうございました!
参照:[私は非常に単純なSQLクエリと思われるものに対してMCVEを提供するのはなぜですか?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an -mcve-for-what-to-me-to-be-a-very-simple-sql-query) – Strawberry