2010-07-22 74 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); 
相關問題