我遇到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),但这没有给我正确的结果。
答案 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;