2012-11-21 49 views
2

我從同一個表a中提取所有子查詢,但需要列b.7dayclicks,c.7dayclicksd.14dayclicks的信息。SQL不同'group by'和'date range'子查詢減慢整個查詢的速度

查詢是這樣的:

select 
    a.higher_tier_id, 
    a.lower_tier_id, 
    b.7dayclicks, 
    c.7dayclicks, 
    d.14dayclicks 
from 
    a, 
    (select higher_tier_id, 7dayclicks 
    from a 
    where day >= curdate() - 7 
    group by higher_tier_id) b, 
    (select lower_tier_id, 7dayclicks 
    from a where day >= curdate() - 7 
    group by lower_tier_id) c, 
    (select lower_tier_id, 14dayclicks 
    from a where day >= curdate() - 14 
    group by lower_tier_id) d 
where 
    day >= curdate() - 3 
    and a.higher_tier_id = b.higher_tier_id 
    and a.lower_tier_id = c.lower_tier_id 
    and a.lower_tier_id = d.lower_tier_id 

它採取了很長一段時間來,結果運行。我試圖讓它更有效率。任何幫助將不勝感激。

  • 第一列給出了higher_id
  • 第二列給出了lower_id
  • 第3列給出7天的點擊次數除以higher_id級排序
  • 第4列給出7天的點擊次數除以lower_id水平
  • 分類第5列給出了按照lower_id排序的14天點擊次數

我確實認爲確實有辦法將所有內容以太沒有任何加入,但我只是不知道如何..

+0

我認爲你可能會把這些邏輯轉到應用程序來做出更簡單的sql查詢。 – SaidbakR

+0

它很難理解你在這裏做什麼,你有一些奇怪的加入進行。不知道更多我會說1)將curdate設置爲一個變量,而不是在每個查詢中調用。 2)確保你在表格a的所有列上正確設置了索引。 –

+0

嗨科林,你是什麼意思將curdate設置爲一個變量,並且索引設置正確? –

回答

0

會這樣的工作?您可以獲得更高和更低級別的ID,然後是7天點擊次數和14天點擊次數的總和。

select 
    a.higher_tier_id, 
    a.lower_tier_id, 
    SUM(CASE WHEN day >= curdate() - 7 THEN 7dayclicks ELSE 0 END), 
    SUM(CASE WHEN day >= curdate() - 14 THEN 14dayclicks ELSE 0 END) 
FROM a 
GROUP BY a.higher_tier_id, a.lower_tier_id