这是一个存储日志/事件的表:
记录[id、日期、时间]
我想通过引用最旧的(第一个插入的)来检索超过 X 天的记录
类似这样的:
SELECT * FROM log
WHERE
(date BETWEEN MIN(date) AND DATE_ADD(MIN(date), INTERVAL X DAY))
GROUP BY date
ORDER BY date, Time
更新: 虽然我提出了一个 SELECT 案例的问题,但实际情况是我需要删除记录(DELETE)。认为它是相同的(我错了),事实是它不能使用同一个表上的嵌套 SELECT 执行 DELETE。 (并且有感觉)。
看到最后很复杂,需要不止一句话,最后我考虑将代码分成两个查询,第一个查询获取第一个插入元素的日期,第二个查询清除。
$sql1 = "SELECT MIN(date) as MinDate FROM `log`";
// Execute the query and gets the result row using whatever database driver[..]
$minDate = $rowQuery["MinDate"]
$sql2 = "DELETE FROM `log` WHERE Date > DATE_ADD('".$minDate."', INTERVAL ".$days." DAY)";
谢谢。
最佳答案
如果你聚合函数,你应该使用having而不是where
SELECT * FROM log
where date in (select date from log
having date BETWEEN Min(date) AND DATE_ADD(date, INTERVAL X DAY))
GROUP BY date)
ORDER BY date, time
但是对于选择来说这更好
SELECT * FROM `log`
where DateF BETWEEN (select min(DateF) from `log`)
AND DATE_ADD((select min(DateF) from `log`), INTERVAL 2 DAY)
ORDER BY DateF, TimeF
http://sqlfiddle.com/#!9/85d9f0/4
事实上,不可能使用子选择删除表,您可以使用临时表 创建表 temp_log ( dateF datetime(6));
insert in temp_log
select DateF FROM `log`
where DateF BETWEEN (select min(DateF) from `log`)
AND DATE_ADD((select min(DateF) from `log`)
delete from `log` as a
inner join temp_log t on t.DateF = a.DateF;
drop table temp_log ;
关于Mysql,检索超过X天的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38230447/