0

我想根据表行中的日期从我的 MySQL 表中获取前 N 周的数据。

想象一下,当前周是第 30 周,我的行中包含第 29、28、26 和 12 周的数据。

如果我想要基于今天日期的最后两周行,那很容易,但我希望它基于行上的时间戳。

因此,如果 N = 2,我想要第 29 周和第 28 周的所有行。如果 N = 3,我想要第 29 周、第 28 周和第 26 周,无论我在哪一周获取它。

我可以使用 PHP 并根据估计的输出进行猜测,但也许我可以利用一些 MySQL 功能。

4

2 回答 2

2

一种方法是使用查询获取您想要返回的周集,然后将该查询用作您可以加入的内联视图。

像这样的东西:

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
于 2012-08-10T21:03:32.637 回答
1

尝试这样的事情(代码未测试):

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 通常会执行得更快。

于 2012-08-10T20:46:28.383 回答