获取过去30天内每天的查询结果

时间:2020-07-07 11:18:59

标签: mysql sql

以下是我过去24小时提取的一些数据的查询。

SELECT
    s.symbol,
    count(cs.symbol_id) AS mentions
FROM symbols s
LEFT JOIN comments_symbols cs ON cs.symbol_id = s.id
LEFT JOIN comments c ON c.id = cs.comment_id
WHERE c.`date` > DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY (s.symbol)
ORDER BY mentions
DESC LIMIT 15

但是,我需要过去30天的24小时间隔的数据才能显示30天的图表。

过去30天内每天没有执行30次此查询,我可以采用一种方法执行一次查询吗?

似乎此查询每页加载执行30次可能不是执行此查询的最佳方法,不是吗?

我希望我解释清楚,请让我知道是否有任何细节不清楚。

1 个答案:

答案 0 :(得分:1)

让我假设您有一个日期列表。如果不想将它们列出,则可以生成它们:

with recursive dates as (
      select curdate() - interval 30 day as dte
      union all
      select dte + interval 1 day
      from dates
      where dte < curdate()
     )

第二,LEFT JOIN似乎是多余的,因为您正在使用LIMIT过滤结果。但是,我将其保留。使用cross join为每一天和每一行生成一个行。 。 。然后汇总:

SELECT s.symbol, COUNT(cs.symbol_id) AS mentions
FROM dates d CROSS JOIN
     symbols s LEFT JOIN
     comments_symbols cs
     ON cs.symbol_id = s.id LEFT JOIN
     comments c
     ON c.id = cs.comment_id AND
        c.date >= d.dte AND
        c.date < d.date + interval 1 day
GROUP BY d.dte, s.symbol
ORDER BY d.dte, mentions DESC

最后,要每天获得15个,我们将其放入CTE并使用窗口函数:

WITH sm as (
      SELECT d.dte, s.symbol, COUNT(cs.symbol_id) AS mentions
      FROM dates d CROSS JOIN
           symbols s LEFT JOIN
           comments_symbols cs
           ON cs.symbol_id = s.id LEFT JOIN
           comments c
           ON c.id = cs.comment_id AND
              c.date >= d.dte AND
              c.date < d.date + interval 1 day
      GROUP BY d.dte, s.symbol
     )
SELECT cs.*
FROM (SELECT cs.*,
             ROW_NUMBER() OVER (PARTITION BY dte ORDER BY mentions DESC) as seqnum
      FROM cs
     ) cs
WHERE seqnum <= 15;
ORDER BY dte, mentions DESC;
相关问题