2017-04-12 159 views
0

我有一个表,其中包含MySQL数据如下。 Size以MB为单位显示文件大小。从MYSQL中删除数据

-------------------------------------------- 
| id | name | size | user_id | created_at | 
-------------------------------------------- 
| 1 | a | 120 | 1  | 2017-04-03 | 
-------------------------------------------- 
| 2 | b | 280 | 1  | 2017-04-04 | 
-------------------------------------------- 
| 3 | c | 220 | 1  | 2017-04-05 | 
-------------------------------------------- 

现在,我想删除最老的数据,如果一个特定的用户已超过500MB的限制。在上面的情况下,需要删除ID#1

任何人都可以帮我写一个查询吗?

+0

不是500 MB。能请你解释逻辑 –

+0

从table_name的 删去created_at中(选择分钟(从表名created_at)) –

+0

比方说,一个用户已经订阅了软件包A给予用户1024MB空间。现在,由于x用户帐户被降级为免费软件包,使用户可以获得500MB的空间。所以我需要删除较旧的和空间不足的文件。 #2和#3是最新的,它们的大小总和为500MB。因此,我们将保留这些文件 –

回答

2

您可以通过三个步骤为其构建查询。首先,你得为每个用户有文件加载后,500MB门槛日期:

select t1.user_id, t1.created_at 
from files t1 
join files t2 
on  t1.user_id = t2.user_id and 
     t2.created_at > t1.created_at 
group by t1.user_id, t1.created_at 
having sum(t2.size) >= 500 

然后为每个用户你这些日子

select user_id, max(created_at) 
from (
      select t1.user_id, t1.created_at 
      from files t1 
      join files t2 
      on  t1.user_id = t2.user_id and 
        t2.created_at > t1.created_at 
      group by t1.user_id, t1.created_at 
      having sum(t2.size) >= 500 
     ) 

最后的越高,你使用它作为参考对于实际delete,通过与源表连接它:

delete t1 
from yourTable t1 
join (
      select user_id, max(created_at) as created_at 
      from (
         select t1.user_id, t1.created_at 
         from files t1 
         join files t2 
         on  t1.user_id = t2.user_id and 
           t2.created_at > t1.created_at 
         group by t1.user_id, t1.created_at 
         having sum(t2.size) >= 500 
        ) 
     ) t2 
on  t1.user_id = t2.user_id and 
     t1.created_at = t2.created_at 

编辑

Working Rextester

在ID 1的数据大小
+0

它只会删除第一条记录。可以有多个记录需要删除 –

+0

明白了,我会想一个更好的解决方案 –

+0

编辑我的问题,现在它应该按预期工作 –