Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 检查行数并删除超出限制的最后一行_Mysql_Sql - Fatal编程技术网

Mysql 检查行数并删除超出限制的最后一行

Mysql 检查行数并删除超出限制的最后一行,mysql,sql,Mysql,Sql,目前,我正在使用以下解决方案检查记录的数量,然后删除超过限制的最后一条记录。伪代码: var count = SELECT COUNT(*) AS count FROM table WHERE user_id = ?; if (count > LIMIT) { // e.g [LIMIT == 5] DELETE FROM table WHERE user_id = ? ORDER BY last_activity LIMIT 1; } 然而,问题是我对这个解决方案并不满意。我

目前,我正在使用以下解决方案检查记录的数量,然后删除超过限制的最后一条记录。伪代码:

var count = SELECT COUNT(*) AS count FROM table WHERE user_id = ?;

if (count > LIMIT) { // e.g [LIMIT == 5]
    DELETE FROM table WHERE user_id = ? ORDER BY last_activity LIMIT 1;
}
然而,问题是我对这个解决方案并不满意。我希望或者更愿意只使用一个sql查询来完成这一切


最后一个活动列的类型是DATETIME。

要将所有内容保存在一个查询中,可以使用以下内容:

DELETE FROM table
WHERE
  user_id = ?
  AND last_activity = (SELECT * FROM
   (SELECT CASE WHEN COUNT(*)>5 THEN MIN(last_activity) END
    FROM table
    WHERE user_id = ?) s)
如果有5个以上的活动,子查询将返回最后一个活动,删除查询将删除它。否则,它将返回NULL,并且不会删除任何行。

当用户的行数超过五行时,可以在delete语句中使用join删除除最近的行以外的所有行:

delete t from table t join
              (select user_id, max(last_activity) as mla
               from table
               group by user_id
               having count(*) > 5
              ) mla
              on t.user_id = mla.user_id and
                 t.last_activity < mla.mla;
编辑:

要删除一行,只需使用最小值而不是最大值:


使用子查询有什么问题?@0101。我很困惑。您的查询将删除一行限制1,但文本表示您必须保留一行。是哪一个?保留一行还是删除一行?对不起,我想我必须删除一行。谢谢你提醒我。非常抱歉造成混淆,查询应该只删除最后一个活动值最小的一行,所以你的示例无法正常工作,但无论如何,谢谢。我还有一个问题。此查询子查询选择用户标识和最后一个活动,然后删除等于…,的行,但是如果我只想选择id而不是user\u id和last\u活动呢?谢谢,我知道这不会有什么不同,但我想知道它是如何工作的。Thanks@0101 . . . 您可以添加类似where userid=从where id=表中选择user\U id的内容?如果我单独尝试此查询,那么首先选择CASE。。。查询,然后从中删除。。。查询工作正常,但我发现一个错误,您无法在中指定要更新的目标表“table”clause@0101修好了,现在应该没事了
delete t from table t join
              (select user_id, max(last_activity) as mla
               from table
               where user_id = '?'
               group by user_id
               having count(*) > 5
              ) mla
              on t.user_id = mla.user_id and
                 t.last_activity < mla.mla;
delete t from table t join
              (select user_id, min(last_activity) as mla
               from table
               where user_id = '?'
               group by user_id
               having count(*) > 5
              ) mla
              on t.user_id = mla.user_id and
                 t.last_activity = mla.mla;