2016-04-23 80 views
2

我一直在試圖找到一種方法來做到這一點,但我似乎無法弄清楚。 下表是我試圖「清理」的那張表。刪除除了每個字段的最後10個以外的所有記錄

------------- 
| Messages | 
------------- 
| ID  | 
| user_id | 
| msg  | 
| timestamp | 
------------- 

基本上我想刪除除user_id最新的10個以外的所有消息。 我真的不知道如何去做這件事。

任何建議將是有用的。

+0

您確定要這麼做嗎?爲什麼? – Strawberry

+0

此表中有超過200萬條記錄,我無法保留每位用戶超過10個記錄。他們從不顯示也不會被需要。 – Roel

回答

-2

嘗試這樣的事情 -

delete from messages where ID = (SELECT ID FROM messages 
ORDER BY timestamp DESC 
LIMIT 10) 

我不知道這是否會工作,但可能給你的是如何做的想法。 我希望這可以幫助。

+0

如果使用'=',子查詢必須返回一個ID。但是你的子查詢返回10個ID。 – Barmar

+0

這不會在每個'user_id'上單獨運行。 – Barmar

-1

您需要爲每個用戶重複此操作。

DELETE FROM Messages where user_id='xyz' and ID NOT IN 
    (SELECT * FROM 
    (SELECT ID FROM Messages where user_id='xyz' ORDER BY timestamp DESC LIMIT 10) 
    AS TOP10) 
+0

MySQL不允許在'IN'和'NOT IN'中使用的子查詢中使用'LIMIT'。 – Barmar

+1

必須爲每個user_id編寫單獨的查詢不是一個很好的解決方案。 – Barmar

2

Using LIMIT within GROUP BY to get N results per group?怎麼寫,用於查找最新的10行對每個user_id查詢。然後,您可以編寫一個查詢,將其作爲子查詢加入,並刪除不在其中的行。

DELETE t1.* 
FROM YourTable AS t1 
LEFT JOIN (SELECT ...) AS t2 
ON t1.id = t2.id 
WHERE t2.id IS NULL 

用您在其他問題中找到的查詢替換(SELECT ...)

相關問題