2016-04-23 77 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 ...)

相关问题