数据库MySQL如何查找删除重复行

当你对b字段排序(分组),数据相同值的何查c被分到不同的组,因此不能用COUNT(DISTINCT c)来计算大小。找删COUNT()之类的除重内部函数只作用于同一个分组,对于不同分组的复行行就无能为力了。类似,数据如果排序的何查是c字段,相同值的找删b也会分到不同的组,无论如何是除重不能达到我们的目的高防服务器的。

几种正确的复行方法

也许最简单的方法是分别对某个字段查找重复行,然后用UNION拼在一起,数据像这样:

select b as value,何查 count(*) as cnt, b as what_col    from a_b_c group by b having count(*) > 1    union    select c as value, count(*) as cnt, c as what_col   from a_b_c group by c having count(*) > 1;    +-------+-----+----------+    | value | cnt | what_col |    +-------+-----+----------+   |     1 |   3 | b        |    |     2 |   3 | b        |   |     3 |   3 | b        |   |     1 |   3 | c        |    |     2 |   3 | c        |   |     3 |   3 | c        |   +-------+-----+----------+

输出what_col字段为了提示重复的是哪个字段。另一个办法是找删使用嵌套查询:

select a, b, c from a_b_c    where b in (select b from a_b_c group by b having count(*) > 1)       or c in (select c from a_b_c group by c having count(*) > 1);   +----+------+------+    | a  | b    | c    |   +----+------+------+   |  7 |    1 |    1 |    |  8 |    1 |    2 |   |  9 |    1 |    3 |    | 10 |    2 |    1 |    | 11 |    2 |    2 |    | 12 |    2 |    3 |    | 13 |    3 |    1 |   | 14 |    3 |    2 |   | 15 |    3 |    3 |   +----+------+------+

这种方法的效率要比使用UNION低许多,并且显示每一重复的除重行,而不是复行重复的字段值。亿华云还有一种方法,将自己跟group的嵌套查询结果联表查询。写法比较复杂,但对于复杂的数据或者对效率有较高要求的情况,是很有必要的。

select a, a_b_c.b, a_b_c.c    from a_b_c      left outer join (        select b from a_b_c group by b having count(*) > 1     ) as b on a_b_c.b = b.b      left outer join (         select c from a_b_c group by c having count(*) > 1      ) as c on a_b_c.c = c.c    where b.b is not null or c.c is not null

以上方法可行,我敢肯定还有其他的方法。如果UNION能用,我想会是最简单不过的了。 

香港云服务器
IT科技类资讯
上一篇:国际域名转移的费用和处理步骤是什么?
下一篇:在此期间,他们每天仍在这里卖大米,在理财方面个人感情有待提高。因为现在是收米的最佳时机。