gpt4 book ai didi

MySQL:从表中删除除 20 行以外的所有行?

转载 作者:行者123 更新时间:2023-11-29 03:05:28 25 4
gpt4 key购买 nike

我有一个包含数十万行的表,分配给了一个用户。例如:

itemid | userid | etc
1 | 1 | etc
2 | 1 | etc
3 | 1 | etc
4 | 3 | etc
5 | 3 | etc
6 | 3 | etc
etc | etc | etc

一个用户可以有任意数量的项目分配给他或她。 IE。从 0 到无穷大的任何数字。我的问题是我想要一个 SQL 查询,它将删除每个用户的所有项目,但保留 20 个。如果用户少于 20 个,例如,只分配了 10 个项目,它必须保留所有 10 个。

我该怎么做?

更新

如果用户有 50 个项目,ID 为 1 - 50,则它必须返回项目 30 - 50。换句话说,返回该用户最后插入的 20 个项目。

最佳答案

假设我们要删除除每个用户的两个最新条目之外的所有条目...

CREATE TABLE my_table(itemid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,userid INT NOT NULL);

INSERT INTO my_table VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 3),
(5, 3),
(6, 3);

SELECT * FROM my_table;
+--------+--------+
| itemid | userid |
+--------+--------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 3 |
| 5 | 3 |
| 6 | 3 |
+--------+--------+

这是一个选择要删除的行的查询...

SELECT a.* 
FROM my_table a
LEFT
JOIN
( SELECT x.*, COUNT(*) FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.itemid >= x.itemid GROUP BY x.itemid HAVING COUNT(*) <=2)b
ON b.itemid = a.itemid
WHERE b.itemid IS NULL;
+--------+--------+
| itemid | userid |
+--------+--------+
| 1 | 1 |
| 4 | 3 |
+--------+--------+

...这是一个删除它们的查询...

DELETE a 
FROM my_table a
LEFT
JOIN
( SELECT x.*, COUNT(*) FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.itemid >= x.itemid GROUP BY x.itemid HAVING COUNT(*) <=2)b
ON b.itemid = a.itemid
WHERE b.itemid IS NULL;

SELECT * FROM my_table;
+--------+--------+
| itemid | userid |
+--------+--------+
| 2 | 1 |
| 3 | 1 |
| 5 | 3 |
| 6 | 3 |
+--------+--------+

关于MySQL:从表中删除除 20 行以外的所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16146359/

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