以下是我过去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次可能不是执行此查询的最佳方法,不是吗?
我希望我解释清楚,请让我知道是否有任何细节不清楚。
答案 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;