SUM一个不同行的字段

时间:2013-01-10 18:09:30

标签: mysql

我遇到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

如果我想确定至少产生一次点击产生的到达百分比,我可以编写以下查询。 (注意 - 并非每次到达都有一个点击,因此LEFT JOIN):

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

当我在同一查询期间将LEFT JOIN到达另一个表(而非click_tracker)时,问题就出现了。

我还有一个名为广告的表格,用于跟踪用户将看到的各种类型的广告。广告与到达相关联,到达时可以包含许多广告。架构如下:

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

现在,我想找到ad_type =“ZXY”的到达百分比以及至少生成一次点击的到达百分比(无论ad_type如何)。执行以下操作无效:

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

广告表的LEFT JOIN创建结果集重复到达ID。因此,当我随后LEFT JOIN到click_tracker表时,我也会获得重复的click_tracker id。

我需要一种方法来为不同的click_tracker行执行SUM(click_tracker.clickouts> 0)。我尝试了SUM(DISTINCT click_tracker.clickouts> 0),但这没有给我正确的结果。

1 个答案:

答案 0 :(得分:0)

我不想这么说,但这两个计算是完全独立的,我认为你需要为它们执行两个查询。这里它们是(以及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_type将GROUP BY更改为WHERE子句。)

至少点击一次的到达百分比:

SELECT
  (COUNT(id) / x.total) AS click_pct
  FROM click_tracker,
       (SELECT COUNT(id) AS total FROM arrivals) x
  WHERE click_tracker.clickouts > 0;