我需要在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);
有人能建议一种更好/更有效的方法来获得我追求的结果吗?
答案 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)
上的索引运行得更快。