Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL删除重复记录,但保留多个记录(例5)_Mysql - Fatal编程技术网

MySQL删除重复记录,但保留多个记录(例5)

MySQL删除重复记录,但保留多个记录(例5),mysql,Mysql,我有一个包含多个重复记录的表,我想根据特定的数字删除其中的一些记录,例如3或5 pr 10重复记录。我如何在MySQL中实现这一点 记录示例: ID TEXT 1000 HELLO JOHN 1001 HELLO JOHN 1002 HELLO JOHN 1003 HELLO JOHN 1004 HELLO JOHN 1005 HELLO JOHN 1006

我有一个包含多个重复记录的表,我想根据特定的数字删除其中的一些记录,例如3或5 pr 10重复记录。我如何在MySQL中实现这一点

记录示例:

ID           TEXT
1000         HELLO JOHN
1001         HELLO JOHN
1002         HELLO JOHN
1003         HELLO JOHN      
1004         HELLO JOHN
1005         HELLO JOHN
1006         HELLO JOHN
1007         HELLO JOHN
1008         HELLO JOHN
1009         HELLO JOHN
ETC...
如果以升序或降序模式删除,则For me不会导入。我只想以一种可控的方式删除记录,例如3条记录、5条记录、10条记录等等

例如,我希望在升序模式下有以下输出

ID           TEXT
1000         HELLO JOHN
1001         HELLO JOHN
1002         HELLO JOHN
1003         HELLO JOHN
1004         HELLO JOHN

我猜你有多条短信,不仅仅是HELLO JOHN

所以您使用会话变量来模拟分区上的行数

请尝试此查询

DELETE t_n
FROM 
       table_name AS t_n
   JOIN
       ( SELECT id 
         FROM table_name
         WHERE text='HELLO JOHN'
         ORDER BY id       
           LIMIT 5
       ) AS lim
     ON t_n.id > lim.id;

我认为最简单的查询是

DELETE FROM Table1 
WHERE ID NOT IN(
  SELECT 
   a.ID
  FROM (
    SELECT 
     ID 
    FROM 
     Table1
    ORDER BY 
     Table1.ID ASC
    LIMIT 5
  ) AS a
)

因为你做不到

DELETE FROM Table1 
WHERE ID NOT IN(
    SELECT 
     ID 
    FROM 
     Table1
    ORDER BY 
     Table1.ID ASC
    LIMIT 5
)
因为它会出错

这个版本的MySQL还不支持LIMIT&IN/ALL/ANY/SOME 子查询'


请参见

如何确定要保留哪些?是那些ID最低的3、5或10,还是通过其他方法?在您的示例中,是N=5,不是吗?请注意,保留哪些语句通常表示设计不佳,如“无关紧要”。这应该很重要!在这种情况下,创建一个临时表并使用INSERT INTO temp SELECT。。。从您的_表中,TEXT='TEXT'按ID排序,RAND LIMIT 5,截断_表并复制_表中的临时数据。或者更好的选项一个deliverd表/相关联的查询,比如在发布的一些答案中。@RaymondNijland好吧,公平地说,我说这可能表明设计不好,你似乎同意我的观点!我真正需要的是:检查我的编辑。我添加了一个选项,可以处理多个文本。
DELETE FROM Table1 
WHERE ID NOT IN(
    SELECT 
     ID 
    FROM 
     Table1
    ORDER BY 
     Table1.ID ASC
    LIMIT 5
)