2013-07-26 54 views
1

我有一個表,表中記錄的IP地址限制表100行,之後刪除最後並添加新的頂端(MYSQL,PHP)

我需要有一個最大Ø100條記錄的數據庫每個用戶然後刪除最後一條記錄,如果用戶達到100條記錄並將新記錄添加到頂部(最新)

什麼是使用PHP或MYSQL查詢執行此操作的最佳方法,我應該使用num_rowsSELECT *

編輯: 我需要限制記錄IP地址在數據庫中的每個用戶,而不是限制示出它們(每個用戶不能在數據庫100多個IPS)

編輯2: 我正在考慮讀取第100個查詢的日期,然後刪除每個記錄與日期<第100個查詢,這是一個很好的做法?

+0

我想你應該在應用層處理邏輯(所以,PHP) – Strawberry

+2

嘗試這樣的查詢,'SELECT ip_address FROM table WHERE user ='username'ORDER BY id DESC LIMIT BY(0,100)'Note:Not tested – Fallen

+0

以某種方式是的,但是使數據庫處理這種操作可能會更好地提高性能。在這種情況下,它並不是真的需要將它提取到php – Martijn

回答

1
$result = mysql_query("SELECT id FROM tablename WHERE user_id=123 ORDER BY id DESC LIMIT 100,1"); 
$fetch = mysql_fetch_assoc($result); 
mysql_query("DELETE FROM tablename WHERE id <".$fetch['id']." AND user_id=123"); 

你說說選擇日期,總是試着去找最快的專欄。你的id列的probally是auto_increment,並有一個索引,這使得它成爲一個快速列。日期值probally沒有索引,因此速度較慢
小旁註:我使用的是mysql_函數,你應該使用mysqli_功能


我嘗試過這些,但他們不正常工作(對我來說):

DELETE FROM tablename WHERE user_id=123 LIMIT 100,9999 

我想嘗試另一種方式是這樣的:

DELETE FROM tablename WHERE user_id=123 
WHERE id NOT IN(SELECT id FROM tablename WHERE user_id=123 ORDER BY id DESC LIMIT 100) 

但子查詢不支持限制(可能是較新版本做的,但分Ë犯規)
馬林Sagovac提出這一點,但對我來說也沒有工作:

DELETE FROM tablename WHERE user_id=123 LIMIT 10 OFFSET 100 
+0

你可以嗎解釋這個查詢在做什麼? – 2013-07-26 12:23:02

+0

'$ page_no = 1; $ limit = 100;' '$ offset =($ page_no - 1)* $ limit' 但是您可以使用'OFFSET'而不是'LIMIT'。 –

+0

謝謝,這解決了這個問題(我獲取第100條記錄的ID,然後刪除它之前的一切),只是一個問題,因爲這個表是AI(自動增量)我從開始刪除大部分記錄,是否可以如果它變得如此之大?可以說AI在一年後從10,000,000開始? – Vladimir

1

嘗試這樣對你有用.....

刪除舊的評論從一個房間1(保留最後3左)

步驟1:

 $sql_com = "SELECT id FROM `mytable` WHERE roomid = '1'"; 

     $result = mysql_query ($sql_com); $num_rows = mysql_num_rows($result); 

步驟2:

如果($ NUM_ROWS> 3){

 $sql_com = "SELECT id FROM `mytable` WHERE roomid = '1' ORDER BY id DESC LIMIT 3,1"; 

     $result = mysql_query ($sql_com); 

    $row = mysql_fetch_array($result, MYSQL_NUM); 

}

第3步:

 $sql_com = "DELETE FROM `mytable` WHERE roomid = '1' AND id < ".$row[0]; 

    $result = mysql_query ($sql_com);