从MYSQL中删除数据
在MySQL中,我有一个包含如下数据的表。大小以MB为单位显示文件大小从MYSQL中删除数据,mysql,Mysql,在MySQL中,我有一个包含如下数据的表。大小以MB为单位显示文件大小 -------------------------------------------- | id | name | size | user_id | created_at | -------------------------------------------- | 1 | a | 120 | 1 | 2017-04-03 | ----------------------------------
--------------------------------------------
| 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的限制,我想删除最旧的数据。在上述情况下,需要删除ID1
有人能帮我写一个查询吗?你可以分三步来建立一个查询。首先,您可以为每个用户获取加载文件的日期(超过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 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
编辑
您可以分三步为其构建查询。首先,您可以为每个用户获取加载文件的日期(超过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 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
编辑
在您的中,id 1的数据大小不是500 mb。请您解释一下logicdelete from table_name where created_at in select mincreated_at from table_name让我们假设一个用户订阅了包a,该包为用户提供了1024MB的空间。现在,由于x原因,用户帐户被降级为免费软件包,这给了用户500MB的空间。因此,我需要删除旧文件和空间不足的文件。2和3是最新的,其大小总和为500MB。所以我们将保留这些文件如果id的唯一条目为500或更多怎么办?@P.Salmon我们需要保留最新的文件,其大小总和小于500MB您id 1的数据大小不是500MB。请解释一下logicdelete from table_name在何处创建?在select mincreated_at from table_name中创建?假设用户已订阅包为用户提供1024MB空间的。现在,由于x原因,用户帐户被降级为免费软件包,这给了用户500MB的空间。因此,我需要删除旧文件和空间不足的文件。2和3是最新的,其大小总和为500MB。因此,我们将保留这些文件如果id的唯一条目为500或更多怎么办?@P.Salmon我们需要保留最新的文件,并且其大小总和小于500位,只删除第一条记录。可能有多条记录需要删除。对于它,我会考虑一个更好的解决方案。它只删除第一条记录。可能有多条记录需要删除。如果需要,我会考虑更好的解决方案