2014-02-08 23 views
0

當前我正在使用以下解決方案檢查記錄數,然後刪除其中最後一個超過限制的記錄。僞代碼:檢查行數並刪除超過限制的最後一個

var count = SELECT COUNT(*) AS count FROM table WHERE user_id = ?; 

if (count > LIMIT) { // e.g [LIMIT == 5] 
    DELETE FROM table WHERE user_id = ? ORDER BY last_activity LIMIT 1; 
} 

但問題是我對此解決方案不滿意。我想或寧願只使用一個SQL查詢來完成所有這些。

last_activity列的類型是DATETIME

+0

什麼是與使用子查詢的問題? – abl

+0

@ 0101。 。 。我很困惑。你的查詢*刪除*一行('限制1'),但文字說你「必須保留一行」。這是什麼?保留一個還是刪除一個? –

+0

對不起,我以爲我必須刪除一行。謝謝你警告我。 – 0101

回答

1

可以使用joindelete語句刪除所有,但最近的一排,當有一個用戶超過五排:

delete t from table t join 
       (select user_id, max(last_activity) as mla 
       from table 
       group by user_id 
       having count(*) > 5 
      ) mla 
       on t.user_id = mla.user_id and 
       t.last_activity < mla.mla; 

這會爲所有用戶。對於一個用戶,添加一個where聲明:

delete t from table t join 
       (select user_id, max(last_activity) as mla 
       from table 
       where user_id = '?' 
       group by user_id 
       having count(*) > 5 
      ) mla 
       on t.user_id = mla.user_id and 
       t.last_activity < mla.mla; 

編輯:

要刪除一行,只需使用min(),而不是max()

delete t from table t join 
       (select user_id, min(last_activity) as mla 
       from table 
       where user_id = '?' 
       group by user_id 
       having count(*) > 5 
      ) mla 
       on t.user_id = mla.user_id and 
       t.last_activity = mla.mla; 
+0

強烈地爲混淆道歉,查詢應該只刪除一行具有最小last_activity值的行,以便您的示例工作不正確,但無論如何謝謝。 – 0101

+0

我還有一個問題。這個查詢(子查詢)選擇user_id&last_activity,然後是等於...的刪除行,但如果我只想選擇id而不是user_id和last_activity,該怎麼辦?謝謝*我知道這不會有什麼區別,但我想知道它是如何工作的。謝謝 – 0101

+0

@ 0101。 。 。 '你可以添加一些東西,如'where userid =(從表中選擇user_id,其中id =?)' –

0

要保持在一個查詢中的一切,你可以使用這樣的事情:

DELETE FROM table 
WHERE 
    user_id = ? 
    AND last_activity = (SELECT * FROM 
    (SELECT CASE WHEN COUNT(*)>5 THEN MIN(last_activity) END 
    FROM table 
    WHERE user_id = ?) s) 

子查詢將返回第一個last_activity,如果有超過5個活動,和DELETE查詢將其刪除。否則它將返回NULL,並且不會刪除行。

+0

如果我單獨嘗試這個查詢,所以首先「SELECT CASE ...」查詢,然後「DELETE FROM ...」查詢正常工作,但是一起出現錯誤「您無法指定目標表'表'在FROM子句中更新「 – 0101

+0

@ 0101固定,現在應該可以吧 – fthiella