需要重写此查询,而无需使用相关子查询

约翰·鲁德尔

我知道如何correlated subqueries工作,通常会避开它们。.但是对于我想做的事情,我找不到其他写此查询的方法。我可以使用它,因为我在使用的表中没有一堆记录..但是现在我需要对其中包含> 100,000条记录的某些表执行相同的操作,这会使此查询花费很长时间时间。因此我需要一些帮助来重写此查询。

初始查询:

SELECT
DATE(m.Created_At) AS m_date,
COUNT(m.id) AS daily_count,
(
    SELECT
        COUNT(m1.id)
    FROM members_joined m1
    WHERE m1.has_verified = 1 and DATE(m1.Created_At) <= m_date
) AS member_totals
FROM members_joined AS m
WHERE m.has_verified = 1 and m.Created_At BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
GROUP BY m_date;

该查询正在执行的操作是获取最多30天之前的注册成员总数。然后在最近30天之间的每一天再次进行总计

m_date      daily_count member_totals
2014-05-27      4           619
2014-05-29      1           620
2014-05-30      3           623
2014-06-02      4           627
2014-06-03      7           634
2014-06-04      10          644
2014-06-05      12          656
2014-06-06      4           660
2014-06-07      3           663
2014-06-08      3           666
2014-06-09      3           669
2014-06-10      5           674
2014-06-11      3           677

如果你发现它是增加由计数每个每日计数。

该查询本身只需要0.036秒即可运行,这没什么大不了的

但是在一些较大的桌子上,它已经花费了12秒,而且它们只会变得更大。

注意:可以在不使用相关子查询的情况下完成此操作吗?假设您不能使用用户定义的变量。

如果无法在mysql中完成此操作,则可以两次访问数据库,然后在python中完成此操作,但是我希望能在MySQL中找到一种解决方案,而不是多次访问数据库。

感谢您的任何指示/帮助!

纽托

使用纯SQL很难做到这一点,但是您可以使用MySQL特定的用户定义变量。您只需要计算每天的计数并累积每一行的计数。

主要技巧是强制MySQL以正确的顺序更新变量。

该查询应如下所示(不确定它是否100%正确):

SELECT m_date, daily_count, @count:=(daily_count + @count) as member_totals
FROM
(SELECT DATE(Created_At) as m_date, COUNT(*) as daily_count
 FROM members_joined
 WHERE DATE(Created_At) >= CURDATE() - INTERVAL 30 DAY AND has_verified = 1
 GROUP BY m_date
) as days,
(SELECT @count:=COUNT(*) as cnt0
 FROM members_joined
 WHERE DATE(Created_At) < CURDATE() - INTERVAL 30 DAY 
   AND has_verified = 1) as init
ORDER BY m_date;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章