수와 연합 또는 합류 -MySQL
문제
쿼리에서 세 개의 테이블 (날짜, 리드 및 클릭)을 결합하고 싶습니다.
테이블은 다음과 같습니다.
데이트:
|date|
선두:
id|time|commission
딸깍 하는 소리:
id|time|commission
테이블 날짜는 날짜를 저장하는 것이며 클릭 또는 리드없이 날짜를 얻을 때 사용됩니다.
따라서 테이블에 다음과 같은 데이터가있는 경우 :
데이트:
2009-06-01
2009-06-02
2009-06-03
선두:
1|2009-06-01|400
2|2009-06-01|300
3|2009-06-03|350
딸깍 하는 소리:
1|2009-06-01|1
2|2009-06-03|2
3|2009-06-03|2
4|2009-06-03|0
날짜, 클릭 수, 클릭으로 생성 된 커미션 (커미션을 제공하지 않는 클릭이 있음), 리드 수, 리드에 의해 생성 된 커미션 및 총 커미션을 받고 싶습니다. 그래서 위의 테이블을 사용하면 다음을 원합니다.
2009-06-01|1|1|2|700|701|
2009-06-02|0|0|0|0|0
2009-06-03|3|4|1|350|354|
나는 다음과 같은 연합을 시도했다.
SELECT
campaign_id,
commission_date,
SUM( click_commission ) AS click_commission,
click,
SUM( lead_commission ) AS lead_commission ,
lead,
SUM( total_commission ) as total_commission
FROM(
SELECT
click.campaign_id AS campaign_id,
DATE( click.time ) AS commission_date,
click.commission AS click_commission,
(SELECT count(click.id) from click GROUP BY date(click.time)) as click,
0 as lead_commission,
0 as lead,
click.commission AS total_commission
FROM click
UNION ALL
SELECT
lead.campaign_id AS campaign_id,
DATE( lead.time ) AS commission_date,
0 as click_commission,
0 as click,
lead.commission AS lead_commission,
lead.id as lead,
lead.commission AS total_commission
FROM lead
UNION ALL
SELECT
0 AS campaign_id,
date.date AS commission_date,
0 AS click_commission,
0 as click,
0 AS lead_commission,
0 as lead,
0 AS total_commission
FROM date
) AS foo
WHERE commission_date BETWEEN '2009-06-01' AND '2009-07-25'
GROUP BY commission_date
ORDER BY commission_date LIMIT 0, 10
그러나 이것은 클릭 수와 리드 수를 모두 계산하는 데 효과적이지 않으며, 위의 코드는 모든 리드에서 올바른 양의 클릭 봇 0을 제공합니다. 코드를 이동하고 리드 테이블에서 선택을 넣으면 모든 클릭에 리드 오른쪽 봇 0을 얻습니다. 쿼리에서 두 가지를 모두 얻을 수있는 방법을 찾을 수 없었습니다.
그래서 대신 왼쪽 조인을 시도했습니다.
SELECT
date.date as date,
count( DISTINCT click.id ) AS clicks,
sum(click.commission) AS click_commission,
count( lead.id ) AS leads,
sum(lead.commission) AS lead_commission
FROM date
LEFT JOIN click ON ( date.date = date( click.time ) )
LEFT JOIN lead ON ( date.date = date( lead.time ) )
GROUP BY date.date
LIMIT 0 , 30
이 쿼리의 문제점은 날짜에 한 번 이상 클릭되거나 리드가있는 경우 예상 값을 반환합니다 * 2. 2009-06-01에서는 리드 커미션에 대해 예상 700 대신 1400을 반환합니다.
그래서 노조에서 나는 카운트에 문제가 있고 왼쪽 가입에서는 작동하지 않는 합이 있습니다.
가능하면 정말로 노동 조합을 고수하고 싶지만 두 가지를 모두 얻을 수있는 방법을 찾지 못했습니다.
(이것은 후속 조치입니다 이것 이전 질문이지만 새로운 질문을 게시했다는 점에서 수를 묻지 않았기 때문에.)
해결책
SELECT date,
COALESCE(lcomm, 0), COALESCE(lcnt, 0),
COALESCE(ccomm, 0), COALESCE(ccnt, 0),
COALESCE(ccomm, 0) + COALESCE(lcomm, 0),
COALESCE(ccnt, 0) + COALESCE(lcnt, 0)
LEFT JOIN
(
SELECT date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
FROM leads
GROUP BY
date
) l
ON l.date = d.date
LEFT JOIN
(
SELECT date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
FROM clicks
GROUP BY
date
) с
ON c.date = d.date
FROM date d
다른 팁
Quassnoi의 제안에서 구축 한 내가 사용한 코드 :
SELECT date,
COALESCE(ccomm, 0) AS click_commission, COALESCE(ccnt, 0) AS click_count,
COALESCE(lcomm, 0) AS lead_commision, COALESCE(lcnt, 0) AS lead_count,
COALESCE(ccomm, 0) + COALESCE(lcomm, 0) as total_commission
FROM date d
LEFT JOIN
(
SELECT DATE(time) AS lead_date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
FROM lead
GROUP BY
lead_date
) l
ON lead_date = date
LEFT JOIN
(
SELECT DATE(time) AS click_date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
FROM click
GROUP BY
click_date
) с
ON click_date = date