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删除完全重复行,求教的主要内容,如果未能解决你的问题,请参考以下文章