2013-05-31 59 views
1

除了最後20的所有入口,我有有列的MySQL表如下MySQLdelete每一個人

chat_id  sender receiver msg  msg_time 

我需要一個查詢,將執行每天刪除除各接收器接收到最新的20條消息的所有消息。是否有單個查詢或我需要在PhP或任何其他編程語言中執行一些代碼

+0

如果要執行日常的東西,你可以使用Cronjobs –

+0

一個解決方案可能是一個PHP腳本由一個cronjob – Fabio

+0

執行我需要一個可能的查詢或編程步驟,爲的cronjob使用一些MySQL的查詢,調合,每天 – sajith

回答

3

嘗試此查詢

select 
    * 
from 
(select 
    @rn:=if(@prv=receiver, @rn+1, 1) as rId, 
    @prv:=receiver as receiver, 
    chat_id, 
    sender, 
    msg, 
    msg_time 
from 
    tbl 
join 
    (select @rn:=0, @prv:='')tmp 
order by 
    receiver, msg_time desc)tmp 
where rid >= 20; 

此選擇查詢將返回所有比去年20爲每個用戶其他的記錄,您可以在delete語句相應地使用它..

delete 
    a 
from 
    tbl a 
inner join 
    (select 
     @rn:=if(@prv=receiver, @rn+1, 1) as rId, 
     @prv:=receiver as receiver, 
     chat_id, 
     sender, 
     msg, 
     msg_time 
    from 
     tbl 
    join 
     (select @rn:=0, @prv:='')tmp 
    order by 
     receiver, msg_time desc 
    )tmp 
on 
    a.chat_id=tmp.chat_id 
where 
    tmp.rId >20 
+0

+1我看到的唯一解決方案是使用變量太 – Stephan

+0

謝謝@Stephan ... :) – Meherzad

+0

感謝您指出...將更新.. – Meherzad

-1

如果您有自動遞增索引,則可以在一個查詢中完成。只是刪除一切與指數< MAX_INDEX - 20 ...

您將需要一個子查詢和最大的功能做

+1

但我怎麼能刪除每個接收器 – sajith

+0

哦,對不起,我沒有正確閱讀,在這種情況下,你需要修改我的答案。但是既然已經有了正確的一個,我就不再詳述了。 – noamik

0

如果你能每天運行此查詢(也許用一個cronjob),它應該是好。 我不完全確定查詢,但它肯定是一個開始。

DELETE FROM messages 
WHERE chat_id NOT IN (
    SELECT chat_id 
    FROM messages 
    GROUP BY sender 
    ORDER BY msg_time DESC 
    LIMIT 20 
) 
+0

我不確定的是內部查詢。有可能這個人不會選擇每個發件人20個帖子,而是總共20個帖子。你應該檢查這個。 – Fons

2

實際上,您可以使用相關子查詢並且不使用任何用戶變量。

DELETE a 
FROM TableName a 
     LEFT JOIN 
     (
      SELECT *, 
        (
         SELECT COUNT(*) 
         FROM tableName c 
         WHERE c.receiver = a.receiver AND 
           c.msg_time >= a.msg_time) AS RowNumber 
      FROM TableName a 
     ) b ON a.receiver = b.receiver AND 
       a.msg_time = b.msg_time AND 
       b.RowNumber <= 3 -- <<== change this to your desired value 
WHERE b.receiver IS NULL 

當前的查詢將刪除除了基於msg_time每個receiver 3最新記錄的所有記錄。只需將3更改爲20即可滿足您的需求。

+0

+1不錯的選擇,但不知道它更優化,那麼從Meherzad – Stephan