[英]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,因为如果我的表中的roomid = 1少于3个条目,那么在第2步的LIMIT 3,1处将出现mysql错误。 (限制3,1期望至少有3个条目)。 我该如何解决,所以可以删除第1步。
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.