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;