SQL不同的“分组依据”和“日期范围”子查询会降低整个查询的速度

时间:2012-11-21 23:54:07

标签: mysql sql

我从同一个表a中提取所有子查询,但需要列b.7dayclicksc.7dayclicksd.14dayclicks中的信息。

查询类似于:

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

结果需要很长时间才能运行。我试图让它更有效率。任何帮助将不胜感激。

  • 第1列给出了higher_id
  • 第二列给出了lower_id
  • 第3列显示按Higher_id级别排序的7天点击次数
  • 第4列显示按lower_id级别排序的7天点击次数
  • 第5列显示按lower_id级别排序的14天点击次数

我确实认为绝对有一种方法可以将所有内容放在一起而不需要任何连接,但我只是无法找到...

1 个答案:

答案 0 :(得分: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