2015-12-14 16 views
7

Tôi đang cố truy xuất số lượt truy cập và số lượng chuyển đổi mỗi ngày cho kết hợp thử nghiệm A/B cụ thể. Mỗi kết hợp đại diện cho một biến thể khác nhau của thử nghiệm A/B. Ở đây tôi chỉ sử dụng '1''2' để thể hiện các biến thể, nhưng về mặt kỹ thuật có thể có nhiều biến thể hơn.Làm cách nào để kết hợp 2 truy vấn SQL và truy xuất số tích lũy?

Tôi đã viết 2 truy vấn sau, hoạt động độc lập. Có thể kết hợp chúng hay viết một truy vấn truy xuất dữ liệu tôi muốn không?

lần truy vấn:

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 

thăm dẫn:

enter image description here

chuyển đổi truy vấn:

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 

chuyển đổi kết quả:

conversions result

Cũng sẽ tuyệt vời nếu tôi có thể nhận được tổng số đang chạy (tích lũy), như dưới đây, xem 2 cột cuối cùng. Tôi đã nhóm lại các bảng dưới đây bằng cách kết hợp nên đếm tích lũy là dễ hiểu:

+---------------+-------------+----------------------+-----------------+--------------+--------------+ 
| 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 | 
+---------------+-------------+----------------------+-----------------+--------------+--------------+ 

Giản đồ cơ sở dữ liệu:

enter image description here

Trả lời

4

Kết hợp khá đơn giản: thêm cột 0 giá trị, làm UNION_ALL, sau đó nhóm lại và tính tổng.

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 

Hiện tại, để chạy tổng. Trong DBMS nâng cao hơn, đây được gọi là các hàm "cửa sổ" hoặc "phân tích". Ví dụ: trong Oracle, bạn có thể thực hiện việc này:

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

cho truy vấn ở trên và nó sẽ cung cấp cho bạn những gì bạn muốn. Tuy nhiên, MySQL không có các chức năng như vậy. Có nhiều cách xung quanh, được mô tả herehere chẳng hạn, nhưng chúng khá phức tạp.

+0

Rất cám ơn Timekiller :) công trình này và tôi đang làm tổng số đang chạy trong PHP. Tôi đã thử nhưng nó không xuất hiện tầm thường để làm các tổng số chạy cho mỗi kết hợp trong MySQL, nhưng cảm ơn cho các liên kết. – mattvick

0

Tôi hy vọng điều này sẽ giúp.

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

Vui lòng giải thích cho câu trả lời của bạn. – DanFromGermany

Các vấn đề liên quan