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

Posted

技术标签:

【中文标题】从 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 表中检索所有行,但首先将它们分组以删除重复

r 从包含 2 列组合的副本的数据框中删除行 [重复]

pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)

从数据框中删除“重复”行(它们在几列中有所不同)[重复]

mysql怎么去除重复数据

R:从R中的大型数据集中根据列中的值删除行[重复]