web-dev-qa-db-ja.com

Mysqlテーブルの重複レコードをカウントしますか?

テーブルがあり、次のような構造になっています。

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

23
dido

アプローチは、複製ごとに1行のネストされたクエリと、内部クエリの結果のカウントのみを返す外部クエリを持つことです。

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

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
11
arutaku

なぜこれをサブクエリでラップしないのですか:

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

SQL Fiddle Demoを使用

10
Taryn

リストの場合:

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

Table View

合計カウントの場合:

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

//合計:5

8
Limitless isa

受け入れられた回答重複がある行の数をカウントするではなく、重複の量ではありません。 重複の実際の数をカウントする場合は、これを使用します。

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/

5
Anthony Vipond