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

标签 mysql

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

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/

相关文章:

html - 在表中显示 check 或 x bool 值

mysql - 如何消除 GROUP BY 中使用的 SELECT 子句标签的歧义?

java - 在 Java 中使用 MySQL 的 IN 语句

php - 使用 mysql 更有效地从下拉菜单填充表单

MySQL 使用过程 analyze() 创建表

mysql - 我的项目必须使用什么技术

mysql - 百表数据库设计

MySQL 设置行字符集

php - MySQL - 更新记录并保持参照完整性

mysql - 如何从 MySQL 中选择唯一组合?