2015-12-14 64 views
7

我在嘗試檢索特定A/B測試組合的每日訪問次數和轉化次數。每種組合代表A/B測試的不同變化。在這裏,我只使用'1''2'來表示變化,但技術上可能會有更多變化。如何組合2個SQL查詢並檢索累計計數?

我寫了以下2個查詢,它們獨立工作。是否可以組合這些或編寫一個查詢來檢索我想要的數據?

訪問查詢:

SELECT DATE(visit.created), visit.combination, COUNT(visit.id) 
FROM visit 
WHERE visit.user_id = 6 
AND visit.experiment_id = 1 
GROUP BY DATE(visit.created), visit.combination 

考察的結果是:

enter image description here

轉換查詢:

SELECT DATE(conversion.created), conversion.combination, COUNT(conversion.id) 
FROM conversion 
WHERE conversion.user_id = 6 
AND conversion.experiment_id = 1 
AND conversion.goal_id = 1 
GROUP BY DATE(conversion.created), conversion.combination 

轉換的結果是:

conversions result

另外,如果我能得到一個正在運行的總(累計)數,如下所示,請參見最後2列。我已經通過組合分組如下表,以便累積計數更容易理解:

+---------------+-------------+----------------------+-----------------+--------------+--------------+ 
| DATE(created) | combination | COUNT(conversion.id) | COUNT(visit.id) | cumulative_c | cumulative_v | 
+---------------+-------------+----------------------+-----------------+--------------+--------------+ 
| 2015-11-17 | 1   |     1 |    3 |   1 |   3 | 
| 2015-11-18 | 1   |     7 |    4 |   8 |   7 | 
| 2015-11-19 | 1   |     3 |    8 |   11 |   15 | 
| 2015-11-17 | 2   |     4 |    1 |   4 |   1 | 
| 2015-11-18 | 2   |     2 |    6 |   6 |   7 | 
| 2015-11-19 | 2   |     9 |    6 |   15 |   13 | 
+---------------+-------------+----------------------+-----------------+--------------+--------------+ 

數據庫模式:

enter image description here

回答

4

結合很簡單:加0值列,再做UNION_ALL,然後組,總和。

SELECT dt, combination, SUM(v_count) as v_count, SUM(c_count) as c_count 
FROM 
(
SELECT DATE(visit.created) as dt, visit.combination as combination, COUNT(visit.id) as v_count, 0 as c_count 
FROM visit 
WHERE visit.user_id = 6 
AND visit.experiment_id = 1 
GROUP BY DATE(visit.created), visit.combination 

UNION ALL 

SELECT DATE(conversion.created) as dt, conversion.combination as combination, 0 as v_count, COUNT(conversion.id) as c_count 
FROM conversion 
WHERE conversion.user_id = 6 
AND conversion.experiment_id = 1 
AND conversion.goal_id = 1 
GROUP BY DATE(conversion.created), conversion.combination 
) as t 
GROUP BY dt, combination 

現在,運行總數。在更高級的DBMS中,這被稱爲「窗口」或「分析」功能。例如,在Oracle中,您可以這樣做:

SELECT dt, combination, SUM(v_count) OVER (PARTITION BY combination ORDER BY dt) as v_cumulative 

對於上述查詢,它會給你正是你想要的。但是,MySQL沒有這樣的功能。有方法,例如herehere,但它們非常複雜。

+0

非常感謝Timekiller :)這工作,我正在做PHP中的運行總數。我嘗試過,但是在MySQL中爲每個組合運行總計並沒有顯得微不足道,但感謝鏈接。 – mattvick

0

我希望這會有所幫助。

SELECT DATE(v.created), v.combination ,DATE(c.created), c.combination, COUNT(v.id), COUNT(c.id) FROM user u 
LEFT JOIN conversion c ON u.id = c.user_id 
LEFT JOIN visit v ON u.id = v.user_id 
WHERE c.id = 6 AND v.experiment_id = 1 AND c.goal_id = 1 
GROUP BY DATE(v.created), v.combination, DATE(c.created), c.combination 
+0

請給你的答案的解釋。 – DanFromGermany