0

キャンペーンの収益レポートを生成するクエリを実行したいと思います。2つのテーブルメンバーと支払いがあります。

members (id, campaign_code)
payments (id, member_id, amount)

campaign_codeグループ化したテーブルを、つまりこの形式で作成したい

campaign_code, member_count, total_revenue 

私はすべてのキャンペーンを配列に入れてこれを実行しています、

SELECT sum( amount ) AS amt
FROM (members
INNER JOIN payments 
    ON payments.member_id = members.id
)
WHERE campaign_code = 'XX'

そしてそれは多くの時間を取っています。とにかくこれを最適化するか、単一のクエリで実行しますか?

4

3 に答える 3

1

すべてのキャンペーン コードの集計が必要だとおっしゃっていたので、これを試してみてください

SELECT m.campaign_code , count(p.member_id) AS member_count,
  SUM( amount ) AS total_revenue
FROM members m, payments p
WHERE p.member_id = m.id
GROUP BY campaign_code;

関数ごとにmysqlグループを必ず読んでください

于 2012-04-16T17:32:12.200 に答える
0

使用する

where campaing_code in ('XX','YY','ZZ','AA','BB')

campaing_code にインデックスを持っている

于 2012-04-16T16:36:17.840 に答える
0

payment (id, member_id, amount) キャンペーンコードごとにグループ化するテーブルを作成したい、つまりこの形式で

Campaign_code, member_count, total_revenue すべてのキャンペーンを配列に入れて実行しています。

select
      m.Campaign_Code,
      count( distinct p.member_id) as Members,
      count(*) as PaymentEntries,
      sum( p.amount ) as TotalRevenue
   from
      members m
         join Payments p
            on m.id = p.member_id
   where
      m.campaign_code = 'XX'

すべてのキャンペーンが必要な場合は、WHERE 句を削除してください。テーブルにはインデックスがあるとコメントで述べましたが、メンバーテーブルにはキャンペーンコードのインデックスがあり、支払いにはメンバーIDのインデックスがあることを確認します。

このクエリは、貢献した個別のメンバーの数、貢献の総数 (1 人以上のメンバーが複数回貢献した場合)、およびすべての貢献の合計を返します。

于 2012-04-16T17:05:03.737 に答える