2016-07-06 55 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