我想根据表行中的日期从我的 MySQL 表中获取前 N 周的数据。
想象一下,当前周是第 30 周,我的行中包含第 29、28、26 和 12 周的数据。
如果我想要基于今天日期的最后两周行,那很容易,但我希望它基于行上的时间戳。
因此,如果 N = 2,我想要第 29 周和第 28 周的所有行。如果 N = 3,我想要第 29 周、第 28 周和第 26 周,无论我在哪一周获取它。
我可以使用 PHP 并根据估计的输出进行猜测,但也许我可以利用一些 MySQL 功能。
一种方法是使用查询获取您想要返回的周集,然后将该查询用作您可以加入的内联视图。
像这样的东西:
SELECT t.*
FROM (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r
JOIN tab t
ON t.week = r.week
内联视图(别名为r
)获取表中最近 N 个周值的列表。(这假设 week 列是可排序的,就像它是一个整数一样。
它连接到表中,使用 ON 子句将表返回的行限制为那些周值与内联视图返回的行匹配的行。
注意:列上的索引week
可以为大量行和week
列上的高基数提供显着的性能优势。
注意:IN (subquery)
对于大型表,执行 JOIN 操作与使用谓词之间可能存在性能差异,如下例所示。对于大多数大型集合以及我所做的查询,我发现 JOIN 通常执行得更好。但是您可能想同时测试两者,看看哪个更适合您。(在小桌子上,这两种方式都不重要;性能差异在真正的大桌子上变得显着。)
SELECT t.*
FROM tab t
WHERE t.week
IN (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r
尝试这样的事情(代码未测试):
SELECT ... FROM table WHERE week IN (
SELECT DISTINCT week FROM table ORDER BY weeks DESC LIMIT 3
)
基本上,只需使用DISTINCT
关键字来获取数据库中实际存在的周的列表,然后使用ORDER BY ... DESC LIMIT 3
来获取最近的三个周。
我在一个子查询中执行此操作,以便您可以将其用作 PHP 中的一次调用,而不是调用数据库,在 PHP 中解析,然后重新提交,这样 MySQL 通常会执行得更快。