繁体   English   中英

如何从表中删除除最新的10行以外的所有行

[英]How to delete all rows from a table except newest 10 rows

我有一个结果(str) ,创建的Mysql架构(timestamp, current on create) ,创建(timestamp, current on create) ,我想运行一个查询来删除除最后10个以外的所有内容,我该怎么做?

  DELETE FROM tablename 
    WHERE id NOT IN (
      SELECT id FROM tablename 
      ORDER BY created DESC 
      LIMIT 10);

您应该先收集10个ID

CREATE TEMPORARY TABLE ids_to_keep ENGINE=MyISAM
SELECT id FROM tablename WHERE 1=2;
INSERT INTO ids_to_keep
SELECT id FROM tablename ORDER BY created DESC LIMIT 10
ALTER TABLE ids_to_keep ADD PRIMARY KEYS (id);

从那里,尝试以下两种技术之一:

技术#1:删除联接

DELETE A.* FROM tablename A
LEFT JOIN ids_to_keep B USING (id)
WHERE B.id IS NULL;
DROP TABLE ids_to_keep;

技术#2:表娱乐

CREATE TABLE tablename_new LIKE tablename;
ALTER TABLE tablename RENAME tablename_org;
INSERT INTO tablename_new
SELECT A.* FROM tablename_org A INNER JOIN ids_to_keep B USING (id);
DROP TABLE tablename_org;
ALTER TABLE tablename_new RENAME tablename;
DROP TABLE ids_to_keep;

试试看 !!!

您还可以使用一种方法的变体,以使用自连接在表中查找第N个最大值。

DELETE FROM tablename WHERE created < (
SELECT created FROM tablename t1 WHERE
 (N - 1) = (SELECT COUNT( DISTINCT( created )
            FROM tablename t1
            WHERE t2.created > t1.created ) ) )

查询的内部部分为您提供了从表中“创建”起的第N个最大值,您可以将其用作删除之前出现的所有内容的参考。

好的,这是9行,而不是10行,但是您知道了...

SELECT * FROM created;
+---------------------+
| t                   |
+---------------------+
| 2013-05-28 19:17:03 |
| 2013-05-28 19:17:06 |
| 2013-05-28 19:17:09 |
| 2013-05-28 19:17:11 |
| 2013-05-28 19:17:13 |
| 2013-05-28 19:17:16 |
| 2013-05-28 19:17:17 |
| 2013-05-28 19:17:19 |
| 2013-05-28 19:17:21 |
| 2013-05-28 19:17:23 |
| 2013-05-28 19:17:25 |
| 2013-05-28 19:17:27 |
| 2013-05-28 19:17:29 |
| 2013-05-28 19:17:31 |
| 2013-05-28 19:17:33 |
| 2013-05-28 19:17:35 |
| 2013-05-28 19:17:37 |
| 2013-05-28 19:17:39 |
+---------------------+
18 rows in set (0.00 sec)

DELETE a
  FROM created a
  JOIN
     (  SELECT x.*
          FROM created x
          JOIN created y
            ON y.t >= x.t
         GROUP
            BY x.t
        HAVING COUNT(*) = 10
     ) b
    ON b.t >= a.t;

SELECT * FROM created;
+---------------------+
| t                   |
+---------------------+
| 2013-05-28 19:17:23 |
| 2013-05-28 19:17:25 |
| 2013-05-28 19:17:27 |
| 2013-05-28 19:17:29 |
| 2013-05-28 19:17:31 |
| 2013-05-28 19:17:33 |
| 2013-05-28 19:17:35 |
| 2013-05-28 19:17:37 |
| 2013-05-28 19:17:39 |
+---------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM