【问题标题】:PHP & MySQL: Delete all old rows keeping 25 of the newest rowsPHP & MySQL:删除所有旧行,保留 25 个最新行
【发布时间】:2015-03-19 12:08:06
【问题描述】:

让我们把它简单化: 我有一个名为 chat 的表格,其中有很多行,每个用户都可以添加一条新消息,这意味着表格可以变得非常大。

(我在网上看过,有些例子不是很“清楚”。)

我需要删除所有旧消息,只保留 25 条最新消息。现在我希望通过 id 来实现,因为我的 id 设置为自动递增。

这是我拥有的,但它不起作用:

DELETE FROM `chat` ORDER BY `id` DESC LIMIT 0,50

我找到并更改了它,但没有运气!

我只是不确定要尝试什么。我不是很有经验,我知道基础知识,非常感谢任何帮助。

【问题讨论】:

  • 那不行。 id 不是以前的 id + 1。它可能是:1...2...5...6...当您删除一些行时发生。

标签: mysql sql-limit


【解决方案1】:

保留 50 条记录:

DELETE FROM `chat`
WHERE id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM `chat`
    ORDER BY id DESC
    LIMIT 50
  ) foo
);

【讨论】:

  • $sql = "SELECT * FROM chat"; $result = $conn->查询($sql); $count = $result->num_rows; $count = $count - 25; $sql = "DELETE FROM chat ORDER BY id DESC LIMIT $count"; if ($conn->query($sql) === TRUE) { echo "true"; } 其他 { 回声“假”; }
  • 我用了别的东西,但我会试试看,谢谢!
  • 您使用 php 和 2 个 db 查询来完成,这可能会慢一些,但可能!
【解决方案2】:

我在评论中看到了您的 php 代码并编辑了我的答案,如果您正在寻找这个,这将是有效的...要删除所有旧行,保留 25 个最新行,只需首先从您的聊天表中选择所有记录,然后计数相同,估计你的限制,即从计数中减去 25,然后,在聊天表上运行删除,但按 DESC 顺序,并给出通过从计数中减去 25 估计的限制。

   $sqli = "SELECT * FROM chat";
  $result = $conn->query($sqli); 
  $count = count($result);
  $limit = $count - 25;
  //echo $limit;
   $sql = "DELETE FROM chat ORDER BY id DESC LIMIT $limit";
   if ($conn->query($sql) === TRUE)
   { 
   echo "true"; 
   } 
   else
    {
        echo "false";

   }

【讨论】:

  • 因为它是一个纯代码答案做一些解释(我不是downvoter,但这可能是原因)
  • 提出问题的Danny已将他的整个代码粘贴在下面的评论中,我调试了相同的代码并在运行相同的代码后粘贴了上面的代码!我认为如果我编辑了粘贴的代码,则无需解释;投反对票是出于谨慎。
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多