2017-04-12 83 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

編輯我的問題,現在它應該按預期工作 –