703

MySQLデータベースの重複レコードを引き出したい。これは次の方法で実行できます。

SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1

その結果:

100 MAIN ST    2

重複している各行が表示されるようにプルしたいと思います。何かのようなもの:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST

これをどのように行うことができるかについて何か考えはありますか?私は最初の1つを実行してから、コード内の2番目のクエリで重複を検索することを避けようとしています。

4

25 に答える 25

729

重要なのは、サブクエリとして使用できるように、このクエリを書き直すことです。

SELECT firstname, 
   lastname, 
   list.address 
FROM list
   INNER JOIN (SELECT address
               FROM   list
               GROUP  BY address
               HAVING COUNT(id) > 1) dup
           ON list.address = dup.address;
于 2009-05-12T18:33:40.133 に答える
395
SELECT date FROM logs group by date having count(*) >= 2
于 2012-03-19T17:57:56.147 に答える
212

INNER JOINテーブルだけではないのはなぜですか?

SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id

DISTINCTアドレスが 2 回以上存在する可能性がある場合は、Aが必要です。

于 2009-05-12T18:49:49.547 に答える
59

この質問に対して選択された最良の回答を試しましたが、多少混乱しました。実際には、テーブルの 1 つのフィールドだけでそれが必要でした。このリンクからの次の例は、私にとって非常にうまくいきました。

SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;
于 2014-01-08T13:45:14.083 に答える
47
select `cityname` from `codcities` group by `cityname` having count(*)>=2

これはあなたが求めた同様のクエリで、200% 機能し、簡単です。楽しみ!!!

于 2011-06-20T10:34:41.790 に答える
36

このクエリを使用して、重複するユーザーをメール アドレスで検索します...

SELECT users.name, users.uid, users.mail, from_unixtime(created)
FROM users
INNER JOIN (
  SELECT mail
  FROM users
  GROUP BY mail
  HAVING count(mail) > 1
) dupes ON users.mail = dupes.mail
ORDER BY users.mail;
于 2012-01-26T00:39:48.783 に答える
22

重複が複数のフィールドにも依存していることがわかります。そのような場合は、以下の形式を使用できます。

SELECT COUNT(*), column1, column2 
FROM tablename
GROUP BY column1, column2
HAVING COUNT(*)>1;
于 2013-03-02T07:04:29.633 に答える
14

重複した住所を見つけることは、特に正確さが必要な場合は、見た目よりもはるかに複雑です。この場合、MySQL クエリでは不十分です...

私はSmartyStreetsで働いており、検証や重複排除などに取り組んでおり、同様の問題を伴うさまざまな課題を数多く見てきました。

リスト内の重複にフラグを立てるサードパーティのサービスがいくつかあります。これを MySQL サブクエリだけで行うと、住所の形式と標準の違いが考慮されません。USPS (米国の住所) には、これらの標準を作成するための特定のガイドラインがありますが、そのような操作を実行することが認定されているベンダーはほんの一握りです。

そのため、たとえばテーブルを CSV ファイルにエクスポートし、それを有能なリスト プロセッサに送信することをお勧めします。その 1 つがLiveAddressで、数秒から数分で自動的に処理されます。「Duplicate」と呼ばれる新しいフィールドとその中の値で重複行にフラグを立てますY

于 2012-01-25T20:00:09.523 に答える
13

別の解決策は、次のようにテーブル エイリアスを使用することです。

SELECT p1.id, p2.id, p1.address
FROM list AS p1, list AS p2
WHERE p1.address = p2.address
AND p1.id != p2.id

この場合、実際に行っていることは、元のリストテーブルを取得し、そこから 2 つのp retend テーブル ( p 1p 2 ) を作成してから、アドレス列で結合を実行することだけです (3 行目)。4 行目は、一連の結果に同じレコードが複数回表示されないようにします ("重複した重複")。

于 2012-06-14T04:14:30.453 に答える
12

あまり効率的ではありませんが、機能するはずです。

SELECT *
FROM list AS outer
WHERE (SELECT COUNT(*)
        FROM list AS inner
        WHERE inner.address = outer.address) > 1;
于 2009-05-12T18:28:47.083 に答える
11

これにより、サブクエリではなく、1 つのテーブル パスで重複が選択されます。

SELECT  *
FROM    (
        SELECT  ao.*, (@r := @r + 1) AS rn
        FROM    (
                SELECT  @_address := 'N'
                ) vars,
                (
                SELECT  *
                FROM
                        list a
                ORDER BY
                        address, id
                ) ao
        WHERE   CASE WHEN @_address <> address THEN @r := 0 ELSE 0 END IS NOT NULL
                AND (@_address := address ) IS NOT NULL
        ) aoo
WHERE   rn > 1

このクエリは実際ROW_NUMBER()に present inOracleSQL Server

詳細については、私のブログの記事を参照してください。

于 2009-05-12T18:36:31.703 に答える
4

最速の重複削除クエリ手順:

/* create temp table with one primary column id */
INSERT INTO temp(id) SELECT MIN(id) FROM list GROUP BY (isbn) HAVING COUNT(*)>1;
DELETE FROM list WHERE id IN (SELECT id FROM temp);
DELETE FROM temp;
于 2012-12-15T04:31:42.143 に答える
4

個人的に、このクエリは私の問題を解決しました:

SELECT `SUB_ID`, COUNT(SRV_KW_ID) as subscriptions FROM `SUB_SUBSCR` group by SUB_ID, SRV_KW_ID HAVING subscriptions > 1;

このスクリプトが行うことは、テーブルに複数存在するすべてのサブスクライバー ID と、見つかった重複の数を表示することです。

これはテーブルの列です:

| SUB_SUBSCR_ID | int(11)     | NO   | PRI | NULL    | auto_increment |
| MSI_ALIAS     | varchar(64) | YES  | UNI | NULL    |                |
| SUB_ID        | int(11)     | NO   | MUL | NULL    |                |    
| SRV_KW_ID     | int(11)     | NO   | MUL | NULL    |                |

それがあなたにとっても役立つことを願っています!

于 2013-04-12T10:05:20.920 に答える
4
 SELECT firstname, lastname, address FROM list
 WHERE 
 Address in 
 (SELECT address FROM list
 GROUP BY address
 HAVING count(*) > 1)
于 2009-05-12T19:09:28.127 に答える
4
select * from table_name t1 inner join (select distinct <attribute list> from table_name as temp)t2 where t1.attribute_name = t2.attribute_name

あなたのテーブルの場合、それは次のようになります

select * from list l1 inner join (select distinct address from list as list2)l2 where l1.address=l2.address

このクエリは、リスト テーブル内のすべての個別のアドレス エントリを提供します...名前などの主キー値がある場合、これがどのように機能するかわかりません..

于 2012-12-01T12:06:33.437 に答える
3
SELECT t.*,(select count(*) from city as tt where tt.name=t.name) as count FROM `city` as t where (select count(*) from city as tt where tt.name=t.name) > 1 order by count desc

都市をテーブルに置き換えます。名前をフィールド名に置き換えます

于 2013-01-25T05:56:53.803 に答える
2
    SELECT *
    FROM (SELECT  address, COUNT(id) AS cnt
    FROM list
    GROUP BY address
    HAVING ( COUNT(id) > 1 ))
于 2009-05-12T18:46:07.180 に答える
1

私は以下を使用します:

SELECT * FROM mytable
WHERE id IN (
  SELECT id FROM mytable
  GROUP BY column1, column2, column3
  HAVING count(*) > 1
)
于 2021-05-24T20:47:05.283 に答える
-1

select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address

内側のサブクエリは重複する住所を持つ行を返し、外側のサブクエリは重複する住所の住所列を返します。外側のサブクエリは、演算子 '= any' のオペランドとして使用されるため、1 つの列のみを返す必要があります

于 2015-01-02T12:55:18.003 に答える