Tôi có thể sai nhưng từ những gì tôi hiểu
- chuyển đổi.id là khóa chính trong bảng của bạn chuyển đổi
- stats.id là khóa chính trong bảng của bạn số liệu thống kê
Vì vậy, đối với mỗi chuyển đổi. Bạn có nhiều nhất một links.id bị ảnh hưởng không.
Yêu cầu của bạn hơi giống với việc làm sản phẩm theo kiểu cacte gồm 2 bộ:
[clicks]
SELECT *
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
[conversions]
SELECT *
FROM links
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
và đối với mỗi liên kết, bạn nhận được sizeof ([nhấp chuột]) x sizeof ([chuyển đổi]) dòng
Như bạn đã lưu ý, số lượng chuyển đổi duy nhất trong yêu cầu của bạn có thể nhận được thông qua
count(distinct conversions.id) = sizeof([conversions])
sự khác biệt này quản lý để loại bỏ tất cả các dòng [nhấp chuột] trong sản phẩm của cartesian
nhưng rõ ràng
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
Trong trường hợp của bạn, kể từ
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
bạn có
sizeof([clicks]) = count(*)/count(distinct conversions.id)
vì vậy tôi sẽ kiểm tra yêu cầu của bạn với
SELECT links.id,
count(DISTINCT stats.id) as clicks,
count(DISTINCT conversions.id) as conversions,
sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY links.id
ORDER BY links.created desc;
Giữ cho tôi được đăng! Jerome