2012-11-21 45 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