MySQL - 检索超过最近12个月以上的所有记录

时间:2013-12-30 03:20:32

标签: mysql sql

我需要在MySQL中编写一个查询,该查询从Downloads表中检索所有行,对于每个唯一引用号(Ref),Downloaded_at字段的年龄超过12个月,除了该数据集的最新行。因此必须按参考编号(Ref)而不是Id进行分组。下载表大致如下:

* ----- -------标识价-------- Downloaded_At ---------------- FILE_NAME ------ *

  1      4WP    2009-08-14 10:13:58    test.txt
  2      3K8    2009-05-21 11:11:10    test2.txt
  3      3K8    2011-12-12 08:12:09    test3.txt

例如,下载时间戳为01Dec12 8.30,01Dec12 9.30,01Dec12 10.30,参考ABC存在下载。然后01Dec12 10.30记录不应出现在查询中,因为它是最新的记录。

我认为如果我按照Id而不是Ref进行分组来编写结果是一个简单的查询,但是就目前而言,我有点挣扎。到目前为止我有这个查询,它(理论上)应该返回正确的结果,但在我的测试数据库上花费的时间太长 - 超过400秒我才取消它并放弃。

SELECT * FROM downloads 
WHERE Downloaded_At < DATE_SUB(NOW(), INTERVAL 1 YEAR)
    AND Id NOT IN 
       (SELECT Id FROM downloads INNER JOIN (select Id, Ref, MAX(Downloaded_At) 
        FROM downloads
        WHERE Downloaded_At < DATE_SUB(NOW(), INTERVAL 1 YEAR)
        GROUP BY Ref) dl on dl.id = downloads.id);

有人能建议一种更好/更有效的方法来获得我追求的结果吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望过滤每个参考的最新下载记录。我不认为您的查询会这样做。

SELECT *
FROM downloads d
WHERE Downloaded_At < DATE_SUB(NOW(), INTERVAL 1 YEAR) and
      Downloaded_At < (SELECT max(Downloaded_At)
                       FROM downloads d2
                       WHERE d2.ref = d.ref
                      );

此查询将以downloads(ref, Downloaded_At)上的索引运行得更快。