gpt4 book ai didi

sql - 如何删除 MySQL 中每个用户的所有不是最新 N 的行?

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:16 27 4
gpt4 key购买 nike

假设我有一个表foo,其中有这样的东西:

id, user_id, timestamp, some_value

我想要做的是删除所有不是最新的 N per user 的行。

删除本身可以由以下人员处理:

DELETE FROM foo WHERE id NOT IN (...)

因此您可以将问题改写为:如何为每个用户获取最新的 N(可能更少)行。这意味着如果我有 U 个用户,我可能会得到 N*U 行,所以 LIMIT 不会真正起作用。

最佳答案

实际上,可以通过一个查询来完成:

DELETE  l.*
FROM foo l
JOIN (
SELECT user_id,
COALESCE(
(
SELECT timestamp
FROM foo li
WHERE li.user_id = dlo.user_id
ORDER BY
li.user_id DESC, li.timestamp DESC
LIMIT 2, 1
), CAST('0001-01-01' AS DATETIME)) AS mts,
COALESCE(
(
SELECT id
FROM foo li
WHERE li.user_id = dlo.user_id
ORDER BY
li.user_id DESC, li.timestamp DESC, li.id DESC
LIMIT 2, 1
), -1) AS mid
FROM (
SELECT DISTINCT user_id
FROM foo dl
) dlo
) lo
ON l.user_id = lo.user_id
AND (l.timestamp, l.id) < (mts, mid)

在这里查看详细的解释:

关于sql - 如何删除 MySQL 中每个用户的所有不是最新 N 的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/711936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com