mysql删除完全重复行,求教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql删除完全重复行,求教相关的知识,希望对你有一定的参考价值。

假如我有一张表,数据在某一个字段有重复(比如我现在的ID重复了)
那么我使用:
SELECT id,COUNT(*) FROM table
GROUP BY id
HAVING COUNT(*) > 1;
语句 意思:
从读下来是 查询id,并且统计行数
数据来自 table表
按照id列进行分组(如果我们按照性别分组,那么现出来的数据只有"男 女")
当统计完成后,count的结果大于1才予以显示
简单的来说就是根据id列进行分组统计,大于1的所有数据显示出来:
使用DELETE 配合 IN 进行删除(IN 如果里面是SQL语句,请尽量不要用于线上程序):
DELETE FROM table WHERE
id IN (
SELECT id FROM (
SELECT id,COUNT(*) FROM table
GROUP BY id
HAVING COUNT(*) > 1
) AS a
) LIMIT 1;
参考技术A :一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项,如下表: a b c d 1 2 3 4 1 5 3 5 1 2 7 9 以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1 2 3 4 或者第三条记录1 2 7

从 mySQL 数据库中删除列重复的重复行

【中文标题】从 mySQL 数据库中删除列重复的重复行【英文标题】:Delete duplicate rows from mySQL database where a column is duplicate 【发布时间】:2014-06-01 02:52:27 【问题描述】:

我有一个这样的 wordpress 表(phpmyadmin 和 MySQL)

| id |  meta_key | meta_value |
+----+-----------+------------+
| 1  | import_id | abc        |
| 2  | import_id | abc        |
| 3  | import_id | def        |
| 4  | import_id | xyz        |
| 5  | import_id | xyz        |
| 6  | import_id | xyz        |
| 7  | something | 123        |
| 8  | something | 234        |
+----+-----------+------------+

我需要获取 meta_key='import_id' 的所有重复行的 id

为了将它们从另一个表中删除。

我想保留“meta_value”相同的每个返回行的 MIN(id)

即输出应该是:

| id |  meta_key | meta_value |
+----+-----------+------------+
| 2  | import_id | abc        |
| 3  | import_id | def        |
| 6  | import_id | xyz        |
+----+-----------+------------+

或者只是

| id |
+----+
| 2  | 
| 3  | 
| 6  | 
+----+

请帮忙,虽然这可能是一个重复的问题,但我仍然遇到问题,因为我的 SQL 有点生疏了。

我可以像这样得到 meta_key='import_id' 的重复项:

SELECT id,meta_value
FROM TABLE 
WHERE meta_key='import_id'
GROUP BY meta_value
HAVING Count(meta_value) > 1

我想从中得到 NON MIN(id) 值

【问题讨论】:

【参考方案1】:

以下查询应返回对的所有非最小 ID:

select t.id
from table t
where t.meta_key = 'import_id' and
      exists (select 1
              from table t2
              where t2.meta_key = t.meta_key and
                    t2.meta_value = t.meta_value and
                    t2.id < t.id
             );

【讨论】:

我得到 0 行返回:/【参考方案2】:
SELECT MAX(id), meta_value, COUNT(*) AS DUPS
FROM TABLE 
WHERE meta_key='import_id'
GROUP BY meta_value
HAVING DUPS > 1;

【讨论】:

【参考方案3】:

您需要在此处使用 MAX() 聚合函数,以获得所需的输出。

您一直在使用“术语”NON MIN (id) - 现在这让我们很困惑。这意味着,您想要所有不是 MIN(id) 的 id,其中 meta_key = 'import_id'。如果是这样,您的输出应该与此类似:

 | id |
 +----+
 | 2  | 
 | 3  |
 | 4  | 
 | 5  | 
 +----+

但是,如果您需要返回您在问题中演示的以下结果:

 | id |
 +----+
 | 2  | 
 | 3  | 
 | 6  | 
 +----+

那么你必须使用MAX()函数。

所以你的查询应该是这样的:

 SELECT MAX(id)
 FROM TABLE 
 WHERE meta_key='import_id'
 GROUP BY meta_value
 HAVING Count(meta_value) > 1

或者如果你想返回所有列的结果,那么试试这个:

 SELECT DISTINCT MAX(id), meta_key, meta_value
 FROM TABLE 
 WHERE meta_key='import_id'
 GROUP BY meta_value
 HAVING Count(meta_value) > 1

在这种情况下,您需要使用 SELECT DISTINCT

【讨论】:

以上是关于mysql删除完全重复行,求教的主要内容,如果未能解决你的问题,请参考以下文章

删除 MySQL 中的重复行

删除 MySQL 中的重复行

删除 MySQL 中除 One 之外的所有重复行? [复制]

MYSQL去重并删除数据最少的重复行

MySQL删除重复行保留一个[关闭]

MYSQL - 将具有多个重复值的行组合起来,然后删除重复项