2010-07-22 76 views
2

我有一个像删除所有行,并保持最新的X左

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

表现在我想删除所有条目,其中roomid = 1,并保持 从roomid最新的3 = 1个左(最好只一个命令)

所以最后ENTRYID:1 & 3传来删除ENTRYID 6,7,9就继续(为确保所有其他roomid仍将留)

编辑: 感谢您的帮助。下面我加入了我自己的解决方案,对每个人都有兴趣

我开始new Question如何把这个改成ONE命令。你可以帮助我。

+0

yikes,请修正格式和详细说明,使您的问题更清晰。 – Fosco 2010-07-22 19:20:13

+0

为什么这需要成为一个命令?我会用两个。 – 2010-07-22 19:20:47

+0

现在我使用2 :) 我工作到现在有两个查询: $ sql_com =“选择id从'mytable' WHERE roomid ='3'ORDER BY id DESC LIMIT 10,1”; \t \t $ row = mysql_fetch_array($ result,MYSQL_NUM); $ sql_com =“DELETE FROM'mytable' WHERE id <”。$ row [0]; 但也许它可以做得更好,只需要一个命令 – 2010-07-22 20:00:49

回答

2

DELETE支持的ORDER BYLIMIT条款,所以这是可能的。但是,由于DELETE的参考限制和参数LIMIT您需要两个查询。

SELECT COUNT(*) AS total FROM table WHERE roomid = 1; 
-- run only if count is > 3 
DELETE FROM table WHERE roomid = 1 LIMIT total - 3; 

请注意,这可能需要中介技术。我已经显示了查询供参考。

+0

有趣的方法,但我不认为MySQL允许'限制'后的变量。你必须构造一个动态的SQL语句。 – Andomar 2010-07-22 19:36:09

+0

@Andomar当然,正如我所指出的,这是或多或少的伪SQL来强调2查询方法。这需要一个帮助技术(比如PHP)来构建动态查询。 – 2010-07-22 19:41:07

+0

我工作到现在有两个疑问: //从那个房间里,删除旧的意见> 100 \t \t $ sql_com = “SELECT ID FROM'mytable' WHERE roomid = '3' ORDER BY ID DESC LIMIT 10,1” ;如果($ result = mysql_query($ sql_com)){} else {echo('Database SELECT ERROR,'。mysql_error());};}如果你有一个数组, \t \t \t \t $ row = mysql_fetch_array($ result,MYSQL_NUM); \t \t \t \t $ sql_com =“DELETE FROM mytable' WHERE id <”。$ row [0];如果($ result = mysql_query($ sql_com)){} else {echo('Database SELECT ERROR,'。mysql_error());};}} \t \t 但也许它可以做得更好,只需一个命令 – 2010-07-22 19:56:50

0

喜欢的东西

delete from TABLE 
where roomid=1 
    and entryid not in 
    (select entryid from TABLE where roomid=1 order by entryid desc limit 0, 3) 

可能会奏效。

+0

不会为mysql工作,无法引用表来删除记录在哪里。需要2个查询 – burnall 2010-07-22 19:27:42

+1

错误1093:您无法在FROM子句中指定目标表'TABLE'进行更新 – Andomar 2010-07-22 19:27:57

1

您可以根据存储的多余房间的ID在一个临时表,并删除:

create temporary table tmpTable (id int); 

insert tmpTable 
     (id) 
select id 
from YourTable yt 
where roomid = 1 
     and 3 <= 
     (
     select count(*) 
     from YourTable yt2 
     where yt2.roomid = yt.roomid 
       and yt2.id > yt.id 
     ); 

delete 
from YourTable 
where ID in (select id from tmpTable);  

这导致:

ID roomid 
2 55 
4 12 
5 44 
6 1 
7 1 
8 3 
9 1 
+1

+1:感觉像是似曾相识...... – 2010-07-22 19:28:02

+0

如果MySQL是手头唯一的技术,那就不错了。但是,国际海事组织,如果有其他可用的话,这将是过度的。 – 2010-07-22 19:34:35

+0

谢谢..但在我看来,如果你有一个大的分贝,它将需要太多的资源 – 2010-07-22 19:55:25

0

T-SQL的家伙在这里,但T-SQL做:

SELECT 
    * 
FROM 
    TABLE A 

    LEFT JOIN (SELECT TOP 3 entryID FROM TABLE WHERE roomID = 1 ORDER BY entryID DESC) B 
    ON A.entryID = B.entryID 
WHERE  
    A.roomID = 1 AND 
    B.entryID IS NULL 

然后替换删除表从选择...

+0

恐怕T-SQL比MySQL允许的方式更强大。这将生成'ERROR 1093:您无法指定目标表'TABLE'以更新FROM子句'错误 – Andomar 2010-07-22 19:43:29

1
SET @deleting = (SELECT COUNT(*) FROM tbl WHERE roomid = 1) - 3; 
-- run only if @deleting is > 0 
PREPARE stmt FROM 'DELETE FROM tbl WHERE roomid = 1 ORDER BY entryid LIMIT ?'; 
EXECUTE stmt USING @deleting; 
0

感谢您的帮助。我把它们放在一起,现在使用该解决方案:) 对我来说,这一步是关闭的。谢谢。

// 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); 
相关问题