Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MYSQL中删除数据_Mysql - Fatal编程技术网

从MYSQL中删除数据

从MYSQL中删除数据,mysql,Mysql,在MySQL中,我有一个包含如下数据的表。大小以MB为单位显示文件大小 -------------------------------------------- | id | name | size | user_id | created_at | -------------------------------------------- | 1 | a | 120 | 1 | 2017-04-03 | ----------------------------------

在MySQL中,我有一个包含如下数据的表。大小以MB为单位显示文件大小

--------------------------------------------
| 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位,只删除第一条记录。可能有多条记录需要删除。对于它,我会考虑一个更好的解决方案。它只删除第一条记录。可能有多条记录需要删除。如果需要,我会考虑更好的解决方案