mysql - query - select duplicate




在MySQL中查找重複的記錄 (15)

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'

我想在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

有關如何做到這一點的任何想法? 我試圖避免做第一個,然後用代碼中的第二個查詢查找重複項。


Powerlord的答案確實是最好的,我會推荐一個更改:使用LIMIT來確保數據庫不會超載:

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
LIMIT 10

如果沒有WHERE和進行連接,使用LIMIT是個好習慣。 從小值開始,檢查查詢的重要程度,然後增加限制。


使用此查詢通過電子郵件地址查找重複用戶...

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;

個人而言,這個查詢解決了我的問題:

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

希望它也會對你有所幫助!


我們可以發現重複取決於多於一個字段。對於這些情況,您可以使用下面的格式。

SELECT COUNT(*), column1, column2 
FROM tablename
GROUP BY column1, column2
HAVING COUNT(*)>1;

我試著為這個問題選擇最好的答案,但它有點讓我困惑。 我真的只需要從我的桌子上的一個字段。 以下來自這個鏈接的例子對我來說非常有效:

SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;

查找重複地址比看起來複雜得多,特別是如果您需要準確性。 在這種情況下,MySQL查詢是不夠的...

我在SmartyStreets工作,我們在那里處理驗證和重複數據刪除等其他事情,我也看到了類似問題帶來的各種挑戰。

有幾個第三方服務會在列表中為您標記重複項。 僅僅通過一個MySQL子查詢來做這件事不會解決地址格式和標準的差異。 USPS(美國地址)有一定的準則來製定這些標準,但只有少數供應商被認證可以執行此類操作。

因此,我建議您為您的最佳答案是將表格導出到CSV文件中,並將其提交給有能力的列表處理器。 其中一個就是LiveAddress ,它會在幾秒到幾分鐘內自動完成。 它將用一個名為“Duplicate”的新字段和一個Y值來標記重複的行。


為什麼不只是INNER與自己加入桌子?

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。


這也會告訴你有多少重複,並且會在沒有連接的情況下排列結果

SELECT  `Language` , id, COUNT( id ) AS how_many
FROM  `languages` 
GROUP BY  `Language` 
HAVING how_many >=2
ORDER BY how_many DESC

這將在一個表傳遞中選擇重複項,而不是子查詢。

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

此查詢可以模擬OracleSQL Server ROW_NUMBER()

有關詳細信息,請參閱我博客中的文章:


    Find duplicate Records:

    Suppose we have table : Student 
    student_id int
    student_name varchar
    Records:
    +------------+---------------------+
    | student_id | student_name        |
    +------------+---------------------+
    |        101 | usman               |
    |        101 | usman               |
    |        101 | usman               |
    |        102 | usmanyaqoob         |
    |        103 | muhammadusmanyaqoob |
    |        103 | muhammadusmanyaqoob |
    +------------+---------------------+

    Now we want to see duplicate records
    Use this query:


   select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;

+--------------------+------------+---+
| student_name        | student_id | c |
+---------------------+------------+---+
| usman               |        101 | 3 |
| muhammadusmanyaqoob |        103 | 2 |
+---------------------+------------+---+

    SELECT *
    FROM (SELECT  address, COUNT(id) AS cnt
    FROM list
    GROUP BY address
    HAVING ( COUNT(id) > 1 ))

SELECT date FROM logs group by date having count(*) >= 2

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

用你的表替換城市 。 用您的字段名稱替換名稱


select `cityname` from `codcities` group by `cityname` having count(*)>=2

這是您所要求的類似查詢以及它的200%工作和簡單。 請享用!!!





duplicates