문제

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

이것이 어떻게 할 수 있는지에 대한 생각이 있습니까? 첫 번째 작업을 피한 다음 코드에서 두 번째 쿼리로 복제물을 찾아 보려고 노력하고 있습니다.

도움이 되었습니까?

해결책

열쇠는이 쿼리를 하위 쿼리로 사용할 수 있도록이 쿼리를 다시 작성하는 것입니다.

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;

다른 팁

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

내면의 내부만이 테이블에 합류하지 않는 이유는 무엇입니까?

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

주소가 두 번 이상 존재할 수 있다면 뚜렷한 것이 필요합니다.

나는이 질문에 대해 선택된 최고의 대답을 시도했지만, 그것은 나에게 다소 혼란 스러웠다. 나는 실제로 내 테이블의 단일 필드에 그것을 필요로했다. 다음의 예 이 링크 나를 위해 아주 잘 작동했습니다.

SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;
select `cityname` from `codcities` group by `cityname` having count(*)>=2

이것은 당신이 요청한 비슷한 쿼리와 200%가 작동하고 쉽게 작동합니다. 즐기다!!!

중복 사용자를 찾으십시오 이메일 주소 이 쿼리로 ...

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 *
FROM tc_tariff_groups
GROUP BY group_id
HAVING COUNT(group_id) >1

?

복제물은 하나 이상의 필드에 따라 다르며 아래 형식을 사용할 수 있습니다.

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

또 다른 솔루션은 다음과 같은 테이블 별명을 사용하는 것입니다.

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

이 경우 정말로 당신이 정말로하고있는 것은 원본을 가져가는 것입니다. 목록 테이블, 두 가지를 만듭니다 테이블을 보유합니다 - 1 그리고 2 - 그 중에서 주소 열 (3 행)에서 조인을 수행합니다. 4 번째 라인은 결과 세트에서 동일한 레코드가 여러 번 나타나지 않도록합니다 ( "Duplicate Duplicates").

중복 찾기 구애 특히 정확도가 필요한 경우보다 훨씬 더 복잡합니다. 이 경우 MySQL 쿼리가 충분하지 않습니다 ...

나는 일한다 smartystreets, 우리는 검증 및 복제 및 기타 작업을 해결하는 곳에서 비슷한 문제로 다양한 도전을 보았습니다.

목록에 중복을 플래그하는 여러 타사 서비스가 있습니다. MySQL 하위 쿼리로만이를 수행한다고해서 주소 형식과 표준의 차이를 설명하지는 않습니다. USPS (미국 주소의 경우)에는 이러한 표준을 만들기위한 특정 지침이 있지만 소수의 공급 업체 만 해당 작업을 수행하도록 인증을 받았습니다.

예를 들어 테이블을 CSV 파일로 내보내고 유능한 목록 프로세서에 제출하는 것이 좋습니다. 그런 것 중 하나입니다 Liveaddress 몇 초에서 몇 분 안에 자동으로 수행 할 수 있습니다. 중복 행을 "중복"이라는 새 필드와 Y 그것에.

매우 효율적이지는 않지만 작동해야합니다.

SELECT *
FROM list AS outer
WHERE (SELECT COUNT(*)
        FROM list AS inner
        WHERE inner.address = outer.address) > 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() 존재합니다 Oracle 그리고 SQL Server

자세한 내용은 내 블로그의 기사를 참조하십시오.

이것은 또한 얼마나 많은 복제가가 가지고 있는지 보여주고 결합없이 결과를 주문할 것입니다.

SELECT  `Language` , id, COUNT( id ) AS how_many
FROM  `languages` 
GROUP BY  `Language` 
HAVING how_many >=2
ORDER BY how_many DESC
 SELECT firstname, lastname, address FROM list
 WHERE 
 Address in 
 (SELECT address FROM list
 GROUP BY address
 HAVING count(*) > 1)
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

이 쿼리는 목록 테이블의 모든 고유 한 주소 항목을 제공합니다 ... 이름 등의 기본 키 값이 있으면 어떻게 작동하는지 잘 모르겠습니다.

가장 빠른 복제 쿼리 절차 :

/* 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;

개인적 으로이 쿼리는 내 문제를 해결했습니다.

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 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 *
    FROM (SELECT  address, COUNT(id) AS cnt
    FROM list
    GROUP BY address
    HAVING ( COUNT(id) > 1 ))

PowerLord 답변 실제로 최고이며 한 가지 더 변경 사항을 추천합니다. DB가 과부하되지 않도록 한도를 사용합니다.

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

가입 장소와시기가 없으면 한계를 사용하는 것이 좋은 습관입니다. 작은 값으로 시작하여 쿼리가 얼마나 무거운 지 확인한 다음 한도를 늘리십시오.

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

중복 행을 신속하게 보려면 단일 간단한 쿼리를 실행할 수 있습니다.

여기서는 테이블을 쿼리하고 동일한 user_id, market_place 및 sku로 모든 중복 행을 나열하고 있습니다.

select user_id, market_place,sku, count(id)as totals from sku_analytics group by user_id, market_place,sku having count(id)>1;

중복 행을 삭제하려면 삭제할 행을 결정해야합니다. 예를 들어 ID가 낮거나 다른 날짜 정보가있는 것입니다. 내 경우에는 최신 ID가 최신 정보이므로 더 낮은 ID를 삭제하고 싶습니다.

먼저 올바른 레코드가 삭제 될지 더블 점검하십시오. 여기서는 (고유 ID)로 삭제 될 복제 중 레코드를 선택합니다.

select a.user_id, a.market_place,a.sku from sku_analytics a inner join sku_analytics b where a.id< b.id and a.user_id= b.user_id and a.market_place= b.market_place and a.sku = b.sku;

그런 다음 삭제 쿼리를 실행하여 Dupes를 삭제합니다.

delete a from sku_analytics a inner join sku_analytics b where a.id< b.id and a.user_id= b.user_id and a.market_place= b.market_place and a.sku = b.sku;

백업, 이중 점검, 확인, 백업 확인 다음에 실행됩니다.

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'의 피연산자로 사용되므로 하나의 열만 리턴해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top