2017-06-07 17 views
-1

私は構造を有している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; 

ありがとうございました!

+0

参照:[私は非常に単純な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

答えて

0

これはかなり単純なクエリのようです。ここでは、顧客や記事の一覧は以下のとおりです。

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(*)またはcount(distinct customerid)のいずれかを使用します。

+0

すばやい返信をいただきありがとうございます。したがって、このクエリは、最後の90日前にそれを購入した顧客の数がどれくらいかという疑問の最終結果を私に提供します。しかし、今私は90日前にそれを買った人の数が必要であり、あなたの結果を分ける必要があります。サブセレクションではs_articles.idが不明なので、ここでは2つのサブセレクトを使用することはできません。これどうやってするの? – Torben

+0

"過去90日間に同じ製品を購入した製品を過去90日間購入したユーザーの数が今すぐになりたい" –

関連する問題