繁体   English   中英

mysql删除所有行并保留最新的x [第2部分]

[英]mysql delete all rows and keep latest x left [part 2]

*首先,感谢您在第一部分的帮助:

情况再次:

“我的表中有“ mytable”字段,entryid(自动增量)和roomid ..,我想删除所有roomid = 1,最后三个除外。”

 entryid,  roomid
   1           1      
   2          55
   3           1
   4          12
   5           1
   6          44
   7           1
   8           3
   9           1

现在我用它解决了:

// Delete older comments from room 1 (keep last 3 left)
// Step 1:
$sql_com = "SELECT id FROM `mytable` WHERE roomid = '1'";
$result = mysql_query ($sql_com); $num_rows = mysql_num_rows($result);   

// Step 2:
if ($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);
}

// Step 3: 
$sql_com = "DELETE FROM `mytable` WHERE roomid = '1' AND id < ".$row[0];
$result = mysql_query ($sql_com);

现在可以正常工作。

  1. 问题:我需要执行步骤1,因为如果我的表中的roomid = 1少于3个条目,那么在第2步的LIMIT 3,1处将出现mysql错误。 (限制3,1期望至少有3个条目)。 我该如何解决,所以可以删除第1步。

  2. MainQuestion:如何将所有这三个步骤整合为一个步骤:)这可能吗?如何?

克里斯(Thx Chris)

ps仅用于提供信息:此例程可能每秒启动500次,具有300万个条目的数据库。 因此,它需要尽可能做到资源友好。

DELETE FROM `mytable` WHERE roomid = '1' AND roomid <= (SELECT * FROM (SELECT roomid FROM `mytable` WHERE roomid = '1' ORDER BY roomid DESC LIMIT 3,1) tmp);

请注意,如果删除“从(...)tmp)中选择*”,可能会出现错误。

ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

我也认为您的代码删除了除最后4个(而不是3个)之外的所有行。

DELETE mytable FROM mytable
JOIN (
  SELECT id FROM mytable
  WHERE roomid = 1
  ORDER BY id DESC
  LIMIT 3,18446744073709551615
) AS t2
ON mytable.id = t2.id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM