0

ネストされたクエリの Noob の質問。この SQL クエリには少し問題があります。助けてください。同じテーブル内の 2 つのフィールドをカウントし、月、年ごとにグループ化しようとしています。クエリは、新規フィールドと更新フィールドで同じ結果を返します。

SELECT MONTH(p.created_at) as Month, YEAR(p.created_at) as Year,
  (SELECT COUNT(p.id) FROM payments p 
INNER JOIN carts c ON c.payment_id = p.id
INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id = 8) as 'New',
  (SELECT COUNT(p.id) FROM payments p 
INNER JOIN carts c ON c.payment_id = p.id
INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id = 13) as 'Renewal',     
FROM payments p   
GROUP BY month, year

助けてくれてありがとう!

クエリの例

Month Year   New    Renewal
1     2010   1169   556
1     2011   1169   556
1     2012   1169   556
2     2010   1169   556
2     2011   1169   556
4

1 に答える 1

0

あなたのクエリを見ると、さまざまな購入可能なアイテムを保持するアイテムテーブルがあると思います。item_id = 8 は「新規」製品に対応し、item_id = 13 は「リニューアル」製品に対応します。

アイテムは、cart_items というリレーション テーブルで販売予定のイベントに関連付けられます。

しかし、すべてのカートが販売されたわけではありませんが、実際に販売されたカートだけを見たいので、支払いテーブルから始めます。

予想される販売が支払われたかどうかは、payment_id を設定することによってカート テーブルに記録されます。

支払いは販売されたカートを表し、支払いから payment.id を取得し、payment_id を carts テーブルに取得し、cart_id を取得します。これを cart_items テーブルに取得し、販売された実際のアイテムを取得します。 item_id が 8 ('New') / 13 ('Renewal') の場合は個別にカウントします。

次に実行しようとしているクエリは次のとおりです。

SELECT MONTH(p.created_at) as Month,
       YEAR(p.create_at) as Year,
       sum(if(ci.item_id = 8, 1, 0)) as New,
       sum(if(ci.item_id = 13, 1, 0)) as Renewal
  FROM payments p,
       INNER JOIN carts c on c.payment_id = p.id
       INNER JOIN cart_items ci on ci.cart_id = c.id
 WHERE ci.item_id in (8,13)
 GROUP BY month, year;

データ セット全体を取得し、グループ化するフィールドでグループ化し、item_id = 8 / item_id = 13 の回数を数えて合計します。

問題のドメインを誤解している可能性があるため、説明が必要な場合や何か間違っている場合はお知らせください。

于 2012-04-29T17:37:23.037 に答える