0

SQL操作に関しては、私はあまり進んでいません。ブログを宣伝するために、バナー システムから次の 4 つのテーブルがあります。

banners 
-id
-other irrelevant data

clicks
-id
-bid (banner id) 
-other irrelevant data

exits (people who clicked on the banner and never used the blog or registered an account)
-id
-bid

postregistered (used the banner and register to the blog)
-id
-bid

total number of clicksここで、各バナーのexitsとを表示する簡単なレポートを生成したいと考えています。reg's

私はこれを試しました:

SELECT COUNT(c.id) as clicks, COUNT(e.id) as exits, COUNT(r.id) as reg
FROM banners b
LEFT JOIN clicks c
ON c.bid = b.id
LEFT JOIN exits e
ON e.bid = b.id
LEFT JOIN registered r
ON r.bid = b.id
GROUP BY b.name

しかし、それはmysqlにプロセッサを強制終了させるだけで完了しません。重いクエリになるのに十分なデータがありません。

これが非常に基本的なように思われる場合は申し訳ありません。

編集:

各左結合を独自に実行して正しい結果を得ることができますが、これを単一のクエリとして実行することをお勧めします

4

1 に答える 1

3

あなたが直面している問題は、各バナーの小さなデカルト積です。簡単に言えば、テーブルをリンクするにはバナー ID だけでは不十分です。

10 個のバナーがあるとします。各バナーには 100 回のクリックがあります。これらのクリックのうち、50 回が離脱で、50 回が登録されています。おそらく、これから 1000 行程度の行が得られると考えているでしょう。

いいえ、これらすべての積を取得しています: 10 * 100 * 50 * 50 = 2,500,000. それは多くの処理です。

クリックから出口、レジまでユーザーを追跡するには、ある種のユーザー ID が必要です。または、クエリを事前に集計することもできます。

select b.bid, b.name, numclicks, numexits, numreg
from banner b left outer join
     (select bid, count(*) as numclicks
      from clicks
      group by bid
     ) c left outer join
     on c.bid = b.bid join
     (select bid, count(*) as numexits
      from exits
      group by bid
     ) e
     on e.bid = b.bid left outer join
     (select bid, count(*) as numreg
      from postregistered
      group by bid
     ) r
     on r.bid = b.bid
于 2013-05-29T13:12:10.370 に答える