mysql - 删除行: No Single Member Has More Than x Records

标签 mysql sql greatest-n-per-group sql-delete

我有一个如下结构的表格:

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/

相关文章:

sql - 获取不在数据库中的范围

php - MySQL - 为特定列中的每个值 y 获取 x 记录

php - 一对多和一对多关系 laravel

MYSQL 日期 - str_to_date() 函数弄乱了我的日期中的年份

sql - 带时区的 Oracle DateTime 查询

MySQL 堆栈过程性能修复,SELECT

MySQL - 如何对 "nested"数据集使用 GROUP BY/ORDER BY?

php - PHP 7.2 中 SELECT 后 PDO::lastInsertId 重置

MySQL BETWEEN 未按预期工作

sql - 从 SQL Server 中的表中选择 XML