mysql / sql:如何删除除每个用户的第N个以外的所有行?

时间:2018-06-14 12:47:59

标签: mysql sql

我有一个快速增长的消息(id,userid,message)表。

我想删除除最后30个

之外的每个用户的所有邮件

例如: 如果user1有100条消息,我们将删除前70条

如果user2有40条消息,我们将删除前10条

如果userN有10条消息,则不采取任何措施

有没有办法用一个SQL做到这一点?

我现在的想法是使用PHP和Lake N sql进行循环,这对于N个用户来说非常长。

2 个答案:

答案 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条消息之间的差异不应对性能产生太大影响。