MySQL-检索除最新记录外所有超过12个月的记录
我需要在MySQL中编写一个查询,从Downloads表中检索每个唯一参考号Ref的Downloads_at字段早于12个月的所有行,该数据集中最近的一行除外。因此,它必须按照参考号Ref而不是Id进行分组。下载表大致如下所示: *---Id---Ref----下载地址-----文件名---*MySQL-检索除最新记录外所有超过12个月的记录,mysql,sql,Mysql,Sql,我需要在MySQL中编写一个查询,从Downloads表中检索每个唯一参考号Ref的Downloads_at字段早于12个月的所有行,该数据集中最近的一行除外。因此,它必须按照参考号Ref而不是Id进行分组。下载表大致如下所示: *---Id---Ref----下载地址-----文件名---* 1 4WP 2009-08-14 10:13:58 test.txt 2 3K8 2009-05-21 11:11:10 test2.txt 3
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
例如,存在ref ABC的下载,下载时间戳为01Dec12 8.30、01Dec12 9.30、01Dec12 10.30。那么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);
有谁能建议一种更好/更有效的方法来获得我想要的结果吗?如果我理解正确,您希望为每个参考筛选最新的下载记录。我认为您的查询无法做到这一点
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
);
这个查询在下载时会运行得更快。如果在下载时有索引,则下载时间为。是的,我再次查看了我的查询,发现它不会返回我想要的内容。你的问题很完美。