除了最後20的所有入口,我有有列的MySQL表如下MySQLdelete每一個人
chat_id sender receiver msg msg_time
我需要一個查詢,將執行每天刪除除各接收器接收到最新的20條消息的所有消息。是否有單個查詢或我需要在PhP或任何其他編程語言中執行一些代碼
除了最後20的所有入口,我有有列的MySQL表如下MySQLdelete每一個人
chat_id sender receiver msg msg_time
我需要一個查詢,將執行每天刪除除各接收器接收到最新的20條消息的所有消息。是否有單個查詢或我需要在PhP或任何其他編程語言中執行一些代碼
嘗試此查詢
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
如果你能每天運行此查詢(也許用一個cronjob),它應該是好。 我不完全確定查詢,但它肯定是一個開始。
DELETE FROM messages
WHERE chat_id NOT IN (
SELECT chat_id
FROM messages
GROUP BY sender
ORDER BY msg_time DESC
LIMIT 20
)
我不確定的是內部查詢。有可能這個人不會選擇每個發件人20個帖子,而是總共20個帖子。你應該檢查這個。 – Fons
實際上,您可以使用相關子查詢並且不使用任何用戶變量。
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
即可滿足您的需求。
+1不錯的選擇,但不知道它更優化,那麼從Meherzad – Stephan
如果要執行日常的東西,你可以使用Cronjobs –
一個解決方案可能是一個PHP腳本由一個cronjob – Fabio
執行我需要一個可能的查詢或編程步驟,爲的cronjob使用一些MySQL的查詢,調合,每天 – sajith