【问题标题】:Getting the N last weeks of MySQL-rows based on date in content根据内容中的日期获取最后几周的 MySQL 行
【发布时间】:2012-08-10 20:40:16
【问题描述】:

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

假设当前周是第 30 周,我的行中包含第 29、28、26 和 12 周的数据。

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

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

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

【问题讨论】:

  • 类似于 SELECT .... WHERE time > value1 AND time
  • 使用 MySQL 的 LIMIT 来选择你需要的范围。
  • 那么,您实际上想要最后 N 数据(恰好是几周),而不是最后 N 周数据?
  • 我想要最后 N 周的数据,因为第 29 周可以包含 12 个条目,而第 28 周只能包含两个条目。

标签: php mysql sql date


【解决方案1】:

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

类似这样的:

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 列上提供高基数。

注意: 对于大型表,执行 JOIN 操作与使用 IN (subquery) 谓词之间可能存在性能差异,如下例所示。对于大多数大型集合以及我所做的查询,我发现 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

【讨论】:

    【解决方案2】:

    试试这样的(代码未测试):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多