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

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

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)时,问题就出现了。

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

+------------+--------------+------+-----+
| 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) 但这并没有给我正确的结果。

4

1 回答 1

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 BYWHERE

至少点击一次的到达率:

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 回答