0

mySQLクエリに問題があります。

ユーザーがクリックした回数を追跡するテーブルがあります。これは、クリックごとに1ずつ増加する単一の整数フィールドです。

スキーマ:

+------------+--------------+------+-----+
| Field      | Type         | Null | Key | 
+------------+--------------+------+-----+
| id         | int(11)      | NO   | PRI | 
| arrival_id | int(11)      | NO   |     |
| clickouts  | int(11)      | NO   |     | 
+------------+--------------+------+-----+

データ例:

id        arrival_id        clickouts
 5            22                0
 6            23                1
 7            24                7

少なくとも1回のクリックを生成した到着の割合を確認したい場合は、次のクエリを記述できます。(注-すべての到着にクリックアウトがあるわけではないため、左に参加します):

SELECT SUM(click_tracker.clickouts > 0)/COUNT(DISTINCT arrivals.id) 
FROM arrivals 
LEFT JOIN click_tracker ON arrivals.id = click_tracker.arrival_id;

この問題は、同じクエリ中に別のテーブル(click_trackerではない)にJOINが到着したときにも発生します。

広告と呼ばれる別のテーブルがあり、ユーザーに表示されるさまざまなタイプの広告を追跡します。広告は到着に関連付けられており、到着には多くの広告を含めることができます。スキーマは次のとおりです。

+------------+--------------+------+-----+
| Field      | Type         | Null | Key | 
+------------+--------------+------+-----+
| id         | int(11)      | NO   | PRI | 
| arrival_id | int(11)      | NO   |     |
| ad_type    | varchar(255) | NO   |     | 
+------------+--------------+------+-----+

ここで、ad_type = "ZXY"の到着の割合と、(ad_typeに関係なく)少なくとも1回のクリックを生成した到着の割合を調べたいと思います。次の手順を実行しても機能しません。

SELECT COUNT(DISTINCT advertisements.id)/COUNT(DISTINCT arrivals.id) AS ad_pct,
SUM(click_tracker.clickouts > 0)/COUNT(DISTINCT arrivals.id) AS click_pct
FROM arrivals
LEFT JOIN advertisements ON arrivals.id = advertisements.arrival_id
LEFT JOIN click_tracker ON arrivals.id = click_tracker.arrival_id

アドバタイズテーブルのLEFTJOINは、結果セットの重複する到着IDを作成します。したがって、後でclick_trackerテーブルにJOINを左に移動すると、click_trackerIDも重複して取得されます。

個別のclick_tracker行に対してのみSUM(click_tracker.clickouts> 0)を実行する方法が必要です。SUM(DISTINCT click_tracker.clickouts> 0)を試しましたが、正しい結果が得られませんでした。

4

1 に答える 1

0

言いたくないのですが、これら2つの計算は完全に独立しているため、2つのクエリを実行する必要があると思います。ここにそれらがあります(そして私が使用したデータを含むsqlfiddle):

による到着の割合ad_type

SELECT
  ad_type,
  (COUNT(arrival_id) / x.total) as ad_pct
  FROM advertisements, 
       (SELECT COUNT(id) AS total FROM arrivals) x
  GROUP BY ad_type;

(または、単一のad_typeGROUP BYの句に変更することもできます。)WHERE

少なくとも1回のクリックでの到着の割合:

SELECT
  (COUNT(id) / x.total) AS click_pct
  FROM click_tracker,
       (SELECT COUNT(id) AS total FROM arrivals) x
  WHERE click_tracker.clickouts > 0;
于 2013-01-11T22:39:01.707 に答える