我有一个快速增长的消息(id,userid,message)表。
我想删除除最后30个
之外的每个用户的所有邮件例如: 如果user1有100条消息,我们将删除前70条
如果user2有40条消息,我们将删除前10条
如果userN有10条消息,则不采取任何措施
有没有办法用一个SQL做到这一点?
我现在的想法是使用PHP和Lake N sql进行循环,这对于N个用户来说非常长。
答案 0 :(得分:0)
dates open high low close adjclose vol
14/06/2018 16:46 191.5500031 191.5700073 190.2200012 190.7599945 190.7599945 10252639
13/06/2018 13:30 192.4199982 192.8800049 190.4400024 190.6999969 190.6999969 21431900
12/06/2018 13:30 191.3899994 192.6100006 191.1499939 192.2799988 192.2799988 16911100
11/06/2018 13:30 191.3500061 191.9700012 190.2100067 191.2299957 191.2299957 18308500
08/06/2018 13:30 191.1699982 192 189.7700043 191.6999969 191.6999969 26656800
07/06/2018 13:30 194.1399994 194.1999969 192.3399963 193.4600067 193.4600067 21347200
06/06/2018 13:30 193.6300049 194.0800018 191.9199982 193.9799957 193.9799957 20933600
05/06/2018 13:30 193.0700073 193.9400024 192.3600006 193.3099976 193.3099976 21566000
答案 1 :(得分:0)
MySQL(8.0之前版本)没有一种非常方便的方法。一种方法使用变量枚举值:
client.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
您可以使用select m.*,
(@rn := if(@u = userid, @rn + 1,
if(@u := userid, 1, 1)
)
) as seqnum
from (select m.*
from messages m
order by userid, id desc
) m cross join
(select @u := -1, @rn := 0) params;
:
delete
join
正如我在评论中所说,我不认为这是解决现实世界问题的好方法。消息的历史很有用,可能还有其他方法可以实现您想要的性能。在调优系统中,用户的30条消息与用户的70条消息之间的差异不应对性能产生太大影响。