2

我在数据库中有一个记录 IP 地址的表

我需要为每个用户提供最多 100 条记录,然后如果用户达到 100 条记录,则删除最后一条记录并将新记录添加到顶部(最新)

使用 PHP 或 MYSQL QUERY 执行此操作的最佳方法是什么,我应该使用num_rowswithSELECT *吗?

编辑: 我需要限制数据库中每个用户的记录 IP,而不是限制显示它们(每个用户在数据库中不能有超过 100 个 IP)

编辑 2: 我正在考虑读取第 100 个查询的日期,然后删除日期 < 第 100 个查询的每条记录,这是一个好习惯吗?

4

2 回答 2

2
$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列可能是 auto_increment 并且上面有一个索引,这使得它成为一个快速列。日期值可能没有索引,因此速度较慢
小旁注:我正在使用 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)

但是子查询不支持限制(也许更新的版本支持,但我的不支持)
Marin Sagovac 建议这样做,但对我也不起作用:

DELETE FROM tablename WHERE user_id=123 LIMIT 10 OFFSET 100
于 2013-07-26T12:21:59.213 回答
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);
于 2013-07-26T12:59:59.733 回答