2016-07-06 54 views
0

它是存储日志/活动表:MySQL和检索具有记录超过X天前

log [id, date, time]

我想引用检索比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)"; 

谢谢。

+0

如果你喜欢,可以考虑下列行为这个简单的两步过程:1.如果您还没有这样做,提供适当的创建和插入语句(和/或sqlfiddle),这样我们可以更容易复制问题。 2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

回答

2

如果聚合函数,你应该使用具有和不到哪

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

做的事实,是不可能删除表使用子选择可以使用临时表 create table 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 ; 
+0

那么,如果您不喜欢子查询可以使用连接重构查询..但是问题是相关的,你想选择*,这应该是相反的惠特组日期..anyway ihope我的回答是有用的 – scaisEdge

+0

我真的只需要WHERE语句,因为我要在DELETE语句中使用。我把'SELECT *'作为例子。它是清除表中的日志记录。 – MikeBau

+0

我有更新答案..希望是你在找什么。 – scaisEdge