我有一个如下结构的表格:
CREAT TABLE `member_logins` (
`id` bigint(10) unsigned not null auto_increment,
`member_id` mediumint(8) unsigned not null,
`date_created` datetime not null,
PRIMARY KEY(`id`)
) ENGINE=InnoDB;
我只想为每个成员保留 50 次登录记录。因此,我正在寻找一种方法来删除每个成员的行,任何超过最近 50 行的行。
编辑:我应该提到...这将是每晚的 cron 作业。不是需要实时完成的事情。
最佳答案
DELETE FROM member_logins
WHERE id in(
SELECT ID
FROM (SELECT
ID,member_id,
IF( @prev <> member_id, @rownum := 1, @rownum := @rownum+1 ) AS rank,
@prev := member_id,date_created
FROM member_logins t
JOIN (SELECT @rownum := NULL, @prev := 0) AS r
ORDER BY t.member_id,t.date_created desc) as tmp
where tmp.rank > 2)
修复了查询。对示例数据进行了测试,它对我有用。
我加载用于测试的示例数据
id member_id date_created
1 1 2/26/2011 12:00:00 AM
2 1 5/26/2011 12:00:00 AM
3 1 4/26/2011 12:00:00 AM
4 2 5/26/2011 12:00:00 AM
5 2 3/26/2011 12:00:00 AM
6 2 4/26/2011 12:00:00 AM
我在查询中使用前 2 行进行测试,而不是 50。
所以我的查询应该删除每个member_id组中排名> 2的所有行,其中行按date_created desc排序。
运行删除查询后的输出:
id member_id date_created
2 1 5/26/2011 12:00:00 AM
3 1 4/26/2011 12:00:00 AM
4 2 5/26/2011 12:00:00 AM
6 2 4/26/2011 12:00:00 AM
您可以看到 ID 为 1 和 5 的行已被删除。这些是每个 member_id 组中排名 > 2 的行
关于mysql - 删除行: No Single Member Has More Than x Records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6824729/