在Mysql表中如何计算重复记录?

30
我有一个表,其结构如下。
tbl
id   name  
1    AAA
2    BBB
3    BBB
4    BBB
5    AAA
6    CCC

select count(name) c from tbl
group by name having c >1

返回这个结果的查询:

AAA(2)  duplicate
BBB(3)  duplicate
CCC(1)  not duplicate

名字重复的是AAA和BBB。我想要的最终结果是这些重复记录的数量。

结果应该像这样: 总共有重复产品(2)


你的查询结果行数不就是表中重复记录的数量吗? - Harry Joy
是的!结果是表中重复记录的数量。 - dido
那么现在的问题是什么?你想要计算重复的数量,现在你已经得到了它。 - Harry Joy
8个回答

48

方法是使用一个嵌套查询,每个重复行都有一行,并且外部查询仅返回内部查询结果的计数。

SELECT count(*) AS duplicate_count
FROM (
 SELECT name FROM tbl
 GROUP BY name HAVING COUNT(name) > 1
) AS t

@Awesome_girl,我不理解你的例子,a~d是4,那么5从哪里来的? - xdazz

17

使用IF语句来获取您想要的输出:

SELECT name, COUNT(*) AS times, IF (COUNT(*)>1,"duplicated", "not duplicated") AS duplicated FROM <MY_TABLE> GROUP BY name

输出:

AAA 2 duplicated
BBB 3 duplicated
CCC 1 not duplicated

那么我们如何在查询中求和?2+3+1? - Zohaib

13

列表:

SELECT COUNT(`name`) AS adet, name
FROM  `tbl` WHERE `status`=1 GROUP BY `name`
ORDER BY `adet`  DESC

表视图

总计数:

    SELECT COUNT(*) AS Total
    FROM (SELECT COUNT(name) AS cou FROM tbl GROUP BY name HAVING cou>1 ) AS virtual_tbl 

// 总数:5


问题是要求重复项的总数,而不是列表。 - Awesome_girl
SELECT COUNT(*) AS Total FROM (SELECT COUNT(name) AS cou FROM tbl GROUP BY name HAVING cou>1 ) AS virtual_tbl - Limitless isa

12

为什么不将这个查询放在子查询中:

SELECT Count(*) TotalDups
FROM
(
    select Name, Count(*)
    from yourTable
    group by name
    having Count(*) > 1
) x

请查看带演示的SQL Fiddle


6

被接受的答案计算的是具有重复行的行数,而不是重复项的数量。如果您想计算实际的重复项数量,请使用以下方法:

SELECT COALESCE(SUM(rows) - count(1), 0) as dupes FROM(

    SELECT COUNT(1) as rows
    FROM `yourtable`
    GROUP BY `name`
    HAVING rows > 1

) x

这个操作的作用是计算分组中的重复项总数,但是减去了具有重复项的记录数量。原因是分组总数不包括所有重复项,每个分组的一行是唯一的记录。
示例: http://sqlfiddle.com/#!2/29639a/3

该问题要求重复项的数量(2),而不是重复项行数的总数(5)。 - Barmar

0

我在PHP中使用这个查询来查询我的表,但它只给我一个结果,而我想知道每个用户名的重复数量,这可能吗?

SELECT count(*) AS duplicate_count
FROM (
 SELECT username FROM login_history
 GROUP BY username HAVING COUNT(time) > 1
) AS t;

0

SQL 代码如下:

SELECT VERSION_ID, PROJECT_ID, VERSION_NO, COUNT(VERSION_NO) AS dup_cnt
FROM MOVEMENTS
GROUP BY VERSION_NO
HAVING (dup_cnt > 1 && PROJECT_ID = 11660)

0
这是查询:
select user_name, count(*) 
from users 
group by user_name 
having count(user_name) > 1

这将返回:

user_name count
abc 5
xyz 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接