2015-07-08 2 views
0

У меня есть этот сумасшедший запрос ниже. Я хочу их организовать, но не знаю, как это сделать. Может кто-нибудь помочь мне запустить этот запрос? Я хочу присоединиться к 5 таблицам подзапросов ниже и в конце, результатом будет таблица, отображающая позицию item_id с last5days, last10days, last30days, last60days, last90days. Спасибо!MySQL соединяет таблицы с подзапросом

Select q1.line_item_id, 
     q1.domains as 'last5days', 
     q2.domains as 'last10days', 
     q3.domains as 'last30days', 
     q4.dpmains as 'last60days', 
     q5.domains as 'last90days' 
From q1 
Join q2 on q1.line_item_id = q2.line_item_id 
Join q3 on q1.line_item_id = q3.line_item_id 
Join q4 on q1.line_item_id = q4.line_item_id 
Join q4 on q1.line_item_id = q5.line_item_id 


select q1.line_item_id, count(*) domains 
from (
     select distinct line_item_id, domain 
     from rpt_domain_by_campaign 
     where event_date between DATE_SUB(curdate(), INTERVAL 5 DAY) 
     and now() 
    ) q1 
group by q1.line_item_id 


select q1.line_item_id, count(*) domains 
from (
     select distinct line_item_id, domain 
     from rpt_domain_by_campaign 
     where event_date between DATE_SUB(curdate(), INTERVAL 10 DAY) 
     and now() 
    ) q2 
group by q1.line_item_id 


select q1.line_item_id, count(*) domains 
from (
     select distinct line_item_id, domain 
     from rpt_domain_by_campaign 
     where event_date between DATE_SUB(curdate(), INTERVAL 30 DAY) 
     and now() 
    ) q3 
group by q1.line_item_id 


select q1.line_item_id, count(*) domains 
from (
     select distinct line_item_id, domain 
     from rpt_domain_by_campaign 
     where event_date between DATE_SUB(curdate(), INTERVAL 60 DAY) 
     and now() 
    ) q4 
group by q1.line_item_id 


select q1.line_item_id, count(*) domains 
from (
     select distinct line_item_id, domain 
     from rpt_domain_by_campaign 
     where event_date between DATE_SUB(curdate(), INTERVAL 90 DAY) 
     and now() 
    ) q5 
group by q1.line_item_id 

ответ

0

Просто используйте сумму и случай сделать более легким: select line_item_id, Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 5 then 1 ELSE 0 END) 'last5days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 10 then 1 ELSE 0 END) 'last10days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 30 then 1 ELSE 0 END) 'last30days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 60 then 1 ELSE 0 END) 'last60days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 90 then 1 ELSE 0 END) 'last90days' from rpt_domain_by_campaign Group by line_item_id

+0

Если некоторые event_date записей в будущем вам нужно добавить еще одно условие КОГДА как КОГДА DATEDIFF (CurDate(), накануне nt_date)> 0 И DATEDIFF (CURDATE(), event_date) <= 5, то ИЛИ Это просчет .... –

+0

выберите ... из ( выберите LINE_ITEM_ID, мин (event_date) event_date из rpt_domain_by_campaign где event_date> = curdate() group by line_item_id, домен ) a Группа: line_item_id –

0

Я рекомендую использовать count(distinct...), чтобы избежать дополнительного слоя вложенности в каждой из ваших подзапросов.

Я также рекомендую переключать порядок подзапросов и используя внешние связи, так как не каждая строка элемент со строками в последние 90 дней, также будут иметь строки в течение последних 60 дней, и т.д.

Попробуйте что-то вроде этого :

Select q1.line_item_id, 
     q1.domains as last90days, 
     coalesce(q2.domains,0) as last60days, 
     coalesce(q3.domains,0) as last30days, 
     coalesce(q4.domains,0) as last10days, 
     coalesce(q5.domains,0) as last5days 
from 
(
    select line_item_id, count(distinct domain) as domains 
    from rpt_domain_by_campaign 
    where event_date between DATE_SUB(curdate(), INTERVAL 90 DAY) 
    and now() 
    group by line_item_id 
) q1 
left outer join 
(
    select line_item_id, count(distinct domain) as domains 
    from rpt_domain_by_campaign 
    where event_date between DATE_SUB(curdate(), INTERVAL 60 DAY) 
    and now() 
    group by line_item_id 
) q2 on q1.line_item_id = q2.line_item_id 
left outer join 
(
    select line_item_id, count(distinct domain) as domains 
    from rpt_domain_by_campaign 
    where event_date between DATE_SUB(curdate(), INTERVAL 30 DAY) 
    and now() 
    group by line_item_id 
) q3 on q1.line_item_id = q3.line_item_id 
left outer join 
(
    select line_item_id, count(distinct domain) as domains 
    from rpt_domain_by_campaign 
    where event_date between DATE_SUB(curdate(), INTERVAL 10 DAY) 
    and now() 
    group by line_item_id 
) q4 on q1.line_item_id = q4.line_item_id 
left outer join 
(
    select line_item_id, count(distinct domain) as domains 
    from rpt_domain_by_campaign 
    where event_date between DATE_SUB(curdate(), INTERVAL 5 DAY) 
    and now() 
    group by line_item_id 
) q5 on q1.line_item_id = q5.line_item_id 
0

Просто используйте группу по максимальной дате select line_item_id, Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 5 then 1 ELSE 0 END) 'last5days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 10 then 1 ELSE 0 END) 'last10days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 30 then 1 ELSE 0 END) 'last30days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 60 then 1 ELSE 0 END) 'last60days', Sum(CASE WHEN DATEDIFF(curdate(), event_date) <= 90 then 1 ELSE 0 END) 'last90days' from ( select line_item_id, max(event_date) event_date from rpt_domain_by_campaign where event_date < curdate() group by line_item_id, domain ) a Group by line_item_id

Смежные вопросы